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#...