今天我要跟你分享的话题是:“MySQL是如何根据undo log 链条实现read view机制的?谈谈看”
一、事务的隔离级别与MVCC?
MySQL单进程多线程的数据库软件,在事务的并发操作中可能会出现脏读,不可重复读,幻读。
MySQL支持的四种事务隔离级别如下:
-
Read uncommited 简单来说就是:事务A可以读到事务B未commit的数据。这种情况也被叫做脏读。
-
Read commited 简单来说就是:事务A可以读到事务B已经commit的数据。
-
Serializable 在该级别下,写会加写锁、读会加读锁,除了读读不互斥,其他组合都互斥,因此可以保证事务串行化顺序执行,可以避免脏读、不可重复读与幻读。
-
Repeatable read 如下图:可重复读要求事务A两次 select 查询出来的结果是一样的,即使中间事务B将id=1的行给修改了,也要保证事务A再读取时,读到的结果也得和第一次读到的结果相同。

但是可重复读存在幻读读问题,比如事务A开启后按某个范围X读取一次(事务未提交),这时其他事务在该范围X内插入了新的数据,事务A再读时就会将新插入的数据读取出来,当然在MySQL的RR隔离级别下不会再出现这种幻行的问题。
问题的解决得益于:MVCC多版本并发控制的快照读和next-key lock 当前读。
二、Repeatable Read是如何实现的
以RR隔离级别为例:
你可以像下面这样看一下你的MySQL默认使用的什么隔离级别:

本文深入探讨MySQL如何在不同隔离级别下利用undo log实现read view机制,以Repeatable Read为例,详细解释了快照读的工作原理,以及在Read Committed隔离级别下的行为。通过实例分析事务并发操作中的数据一致性问题,并阐述MVCC在解决这些问题中的作用。
最低0.47元/天 解锁文章
9724

被折叠的 条评论
为什么被折叠?



