MySQL的存储引擎、事务和锁机制

1.什么存储引擎

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧,锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。(存储引擎说白了,就像模板,每个模板有自己的主要功能,数据库管理系统在此模板上建立MySQL5.5之后的默认是InnoDB

2.什么事务

  • 在MySQL中的事务是由存储引擎实现的,在MySQL,只有InnoDB存储引擎才支持事务。
  • 事务处理可以维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
  • 事务用来管理DDL、DML、DCL操作,比如insert,update,delete语句,默认是自动提交的。
    在这里插入图片描述
    在这里插入图片描述

2.1 MySQL事务的基本操作

在这里插入图片描述
Mysql事务是自己执行的,执行一条语句就开启一次关闭一次
在这里插入图片描述
案列

create database if not exists mydb02_transcation;
use mydb02_transcation;
-- 创建账户表
create table account(
 id int primary key,
 name varchar(20),
 money double
 );
 
 -- 插入数据
 insert into account values(1,'zhangsan',1000);
 insert into account values(2,'lisi',1000);
 
 -- 设置MySQL的事务为手动提交(关闭自动提交)
 set autocommit = 0;
 -- 模拟账户转账
 -- 开始事务
 begin;
 update account set money = money - 200 where name ='zhangsan';
 update account set money = money + 200 where name = 'lisi';
 
 -- 提交事务
 commit; -- 执行完这个语句,才会查询出来
 
 -- 回滚事务
 rollback; -- 如果执行代码中有错误,将之前执行语句回滚回去,数据变回原样

2.2 MySQL事务的特性

原子性、一致性、隔离性、持久性
在这里插入图片描述

2.3 MySQL事务的隔离级别

顾名思义就是将事务与另一个事务隔离开,为什么要隔离呢?
答: 如当一个事务正在操作的数据被另一个事务修改或删除了,最后的执行效果可能无法达到预期?

在这里插入图片描述
四种会出现的级别
在这里插入图片描述
在这里插入图片描述

脏读:就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
例如:(事务A修改未提交,事务B查看,随后A回归,B提交再查看,数据不一样)
张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。

与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。

随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。

最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读

不可重复读
是指在A事务内,多次读同一数据。在A事务还没有结束时,另外一个B事务也访问该同一数据。那么,在A事务中的两次读数据之间,由于B事务的修改,那么A事务两次读到的的数据可能是不一样的。这样就发生了A事务内两次读到的数据是不一样的,因此称为是不可重复读。
例如:(查询 修改 查询)
在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。

与此同时,事务B把张三的工资改为8000,并提交了事务。

随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
幻读
是指当事务不是独立执行时发生的一种现象,例如A事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,B事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作B事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

例如:(一个修改,一个插入)
目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。
此时,
事务B插入一条工资也为5000的记录。
这时,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。

操作:
在这里插入图片描述

3. 什么是MySQL的锁机制

锁是计算机协调多个进程或线程并发访问某一个资源的机制(避免争抢);

从对数据操作的粒度分
1)表锁:操作时,会锁定整个表
1)行锁:操作时,会锁定当前操作行
从对数据操作的类型分
1)读锁:针对同一份数据,多个读操作可以同时进行,而不会互相影响。
2)写锁:当前操作没有完成之前,它会阻断其他写锁和读锁。

在这里插入图片描述

3.1 MyISAM表锁

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MylSAM表显式加锁。
在这里插入图片描述

3.2 InnoDB行锁

InnoDB与MyISAM的最大不同有两点:一是支持事务;二是采用了行锁;

在这里插入图片描述
操作:
在这里插入图片描述

参考

https://blog.csdn.net/weixin_33724264/article/details/113442844
https://www.bilibili.com/video/BV1iF411z7Pu?p=159&spm_id_from=pageDriver

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值