文章目录
- 前言
- 一、事务特性
- 二、事务并发引起的问题
-
- 1.脏读
- 2.不可重复读
- 3.幻读
- 三、Mysql四种隔离级别
-
- 1.未提交读
- 2.已提交读
- 3.可重复读
- 4.串行化
- 四、MVCC、版本链、ReadView原理
-
- 1.MVCC
- 2.版本链
- ReadView
- 已提交读隔离级别实现原理
- 可重复读隔离级别实现原理
-
- InnoDB 如何解决幻读?
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
一、事务特性
事务特性 ACID: 原子性:最小的执行单位,要么同时成功,要么同时失败 一致性:数据一致性 隔离型:多个事务执行时,彼此隔离,否则有事务并发问题 持久性:数据库永久保存
二、事务并发引起的问题
1.脏读
事务B读取到事务A未提交的脏数据
2.不可重复读
在同一条数据中,事务B前后两次读取的值不一致,通常是数据修改
3.幻读
在同一范围中,事务B前后两次读取的行数不一致,通常是数据新增删除
补充:幻读是指两次相同的查询(查询类型相同)返回不同行集。这里两次查询类型不同(一次快照读,一次当前读),因此不属于典型的幻读
严重程度排名:脏读>不可重复读>幻读
三、Mysql四种隔离级别
1.未提交读
可能有脏读、不可重复读、幻读问题
2.已提交读
可能有不可重复读、幻读问题
3.可重复读
InnoDB 默认隔离级别。通过 MVCC 避免快照读的幻读,通过间隙锁避免当前读的幻读,因此在 InnoDB 中实际上完全解决了幻读问题(但标准 SQL 定义中仍允许幻读,需要说明这一区别)。
4.串行化
不存在事务隔离级别
四、MVCC、版本链、ReadView原理
1.MVCC
MVCC是多版本并发控制,是一种并发控制的概念/思想,在 InnoDB 中,这个思想是通过具体的机制实现的,就是常说的版本链和ReadView。
2.版本链
undo日志:每次操作数据会生成一条undo日志 关键信息:操作记录、事务ID、回滚指针 
ReadView
读视图,关键信息如下: m_ids 活跃的事务ids min_trx_id 最小的事务id max_trx_id 最大的事务id creator_trx_id 生成事务的id
版本链+ReadView,解决脏读、不可重复读问题
已提交读隔离级别实现原理
使用已提交读隔离级别,在每次查询之前都会生成一个ReadView,解决脏读,但可能导致不可重复读和幻读
可重复读隔离级别实现原理
使用可重复读读隔离级别,在第一次查询之前都会生成一个ReadView,解决不可重复读问题,但 MVCC 其实也同时解决了快照读下的幻读
InnoDB 如何解决幻读?
InnoDB 的查询分为两类:
- 快照读:普通 SELECT,利用 MVCC 和 ReadView,读取数据的快照版本,复用首次生成的 ReadView,后续插入的数据不可见,保证多次读取结果一致,彻底避免了幻读。
- 当前读:SELECT … FOR UPDATE / UPDATE / DELETE,它们读取的是数据的最新版本,并且会对读取的数据加锁。,通过间隙锁锁定范围,防止其他事务插入新数据,从而避免幻读。 因此,在 InnoDB 可重复读隔离级别下,通过 MVCC + 间隙锁 完全解决了幻读问题。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了Mysql事务隔离级别的使用,欢迎评论区一起交流。

