mvcc

mvcc的次要作用:在特定隔离级别下,进步mysql的读写的并发能力

快照读

读未提交

事务不须要隔离

读已提交

mvcc+view实现:查问一条数据时,事务生成这个ReadView,依据视图和undoLog中的版本号和删除版本号来判断是否可见,同时满足上面两个条件才对本事务可见

  • undolog的creator_id满足条件
  • delete_id须要大于本事务id
可反复读

mvcc+view实现:开启事务时,事务生成ReadView,依据视图和undoLog中的版本号和删除版本号来判断是否可见,同时满足上面两个条件才对本事务可见

  • undolog的creator_id满足条件
  • delete_id须要大于本事务id

以后读

读未提交

事务不须要隔离

读已提交

可应用与快照读雷同计划

可反复读

应用mvcc+间隙锁实现,尽量避免幻读

能防止幻读的场景

在可反复读的隔离级别下,应用以后读,innodb会应用间隙锁来锁住全表或者某几个间隙(看应用什么索引)
例如select for update where id > 8;
db会生成间隙锁,防止其余事务插入id>8的记录,这样防止幻读

不能防止幻读场景
  • 对于快照读, MVCC 并不能完全避免幻读景象。因为当事务 A 更新了一条事务 B 插入的记录,那么事务 A 前后两次查问的记录条目就不一样了,所以就产生幻读。
  • 对于以后读,如果事务开启后,并没有执行以后读,而是先快照读,而后这期间如果其余事务插入了一条记录,那么事务后续应用以后读进行查问的时候,就会发现两次查问的记录条目就不一样了,所以就产生幻读。

所以,MySQL 可反复读隔离级别并没有彻底解决幻读,只是很大水平上防止了幻读景象的产生。

参考:
https://www.xiaolincoding.com/mysql/transaction/phantom.html#...