mysql隔离级别的实现
mysql隔离级别的实现原理
-
读未提交没有额外隔离实现,简单粗暴
-
串行化直接上共享锁,效率低,但隔离效果好。
-
可重复读隔离级别(读已提交)利用MVCC做版本控制,每个事务都会有当前数据库的快照
InnoDB 利用了“所有数据都有多个版本”的这个特性,实现了“秒级创建快照”的能力。
-
在时间线上,每个事务有自己的row trx_id和事务信息,每个事务只能读到本事务快照生成的时间点以前已经生成快照事务提交的版本。
-
高水位低水位问题:
在实现上, InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。
低水位:数组里面事务 ID 的最小值记。
高水位:当前系统里面已经创建过的事务 ID 的最大值加 1 。
视图数组和高水位,就组成了当前事务的一致性视图(read-view)。可以这么理解: 低水位↓ 高水位↓ [已提交事务 | 未提交(活跃)事务 | 未开始事务]
-
并发写问题。加行锁
-
解决幻读。临键锁(行锁+间隙锁)。 MVCC为什么不能解决幻读问题?因为MVCC针对已有行做版本控制,但新插入的数据就不行了。
-