共计 757 个字符,预计需要花费 2 分钟才能阅读完成。
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#…
正文完