今天我要跟你分享的话题是:“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隔离级别下不会再出现这种幻行的问题。