Mysql 事务隔离级别
首先 Mysql 支持事务的常用 引擎是 INNODB
Mysql 事务的特性为 :ACID
A: 原子性,即为最小的逻辑执行单位---实现原理: undo log
C: 一致性,要么同时成功,要么同时失败
I: 隔离性,指事务内部的操作与其它事务是隔离的,并发执行各个事务之间不干扰。
D: 持久性,一旦事务成功,数据一定会存储到数据库--- 实现原理 redo log
事务隔离等级分为
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
1.脏读
引起原因是--- 事务的隔离级别为 READ-UNCOMMITTED(读未提交)
事务A 开始事务,并执行查询 select * from student,未提交 | |
---|---|
事务B 开始事务,并执行 insert into student values('6','6','6','2021'),未提交 | |
事务A 再次执行查询,查询到 事务B 未提交的数据条 | |
事务B 未提交的数据回滚 | |
事务A 再次执行查询,查询不到 事务B 未提交的数据条 |
2.不可重复读
事务的隔离级别为 READ-COMMITTED(读已提交-又叫 不可重复读)
在事务A 中先后两次读取同一数据,两次读取的结果都不一样,这种现象称为不可重复读。 重复读与脏读 的区别在于, 脏读是 读取到 未提交的数据,不可重复读是 读取到 已提交的数据。
事务A 开始事务,并执行查询 select * from student where id='1',未提交 | |
---|---|
事务B 开始事务,并执行 update student set age='999999' where id='1'并提交 | |
事务A 再次执行查询,查询到 事务B 修改的数据条,和第一次不一样,产生不可重复读问题 |
3.幻读
不可重复读和幻读的区别是,不可重复的是数据产生了变化,幻读是多了新增的数据
事务A 开始事务,并执行查询 select * from student,未提交 | |
---|---|
事务B 开始事务,并执行 insert into student values('7','7','7','2021') 并提交 | |
事务A 再次查询 查询结果与上一次不一样,出现幻读 |
评论区