mvcc
mvcc的主要作用:在特定隔离级别下,提高mysql的读写的并发能力
快照读
读未提交
事务不需要隔离
读已提交
mvcc+view实现:查询一条数据时,事务生成这个ReadView,根据视图和undoLog中的版本号和删除版本号来判断是否可见,同时满足下面两个条件才对本事务可见
- undolog的creator_id满足条件
- delete_id需要大于本事务id
可重复读
mvcc+view实现:开启事务时,事务生成ReadView,根据视图和undoLog中的版本号和删除版本号来判断是否可见,同时满足下面两个条件才对本事务可见
- undolog的creator_id满足条件
- delete_id需要大于本事务id
当前读
MySQL 里除了普通查询是快照读,其他都是当前读
读未提交
事务不需要隔离
读已提交
可使用与快照读相同方案
可重复读
使用mvcc+间隙锁实现,尽量避免幻读
能避免幻读的场景
在可重复读的隔离级别下,使用当前读,innodb会使用间隙锁来锁住全表或者某几个间隙(看使用什么索引)
例如select for update where id > 8;
db会生成间隙锁,避免其他事务插入id>8的记录,这样避免幻读
不能避免幻读场景
- 当事务 A 更新了一条事务 B 插入的记录,那么事务 A 前后两次查询的记录条目就不一样了,所以就发生幻读。
- 当事务开启后,并没有执行当前读,而是先快照读,然后这期间如果其他事务插入了一条记录,那么事务后续使用当前读进行查询的时候,就会发现两次查询的记录条目就不一样了,所以就发生幻读。
所以,MySQL 可重复读隔离级别并没有彻底解决幻读,只是很大程度上避免了幻读现象的发生。
参考:
https://www.xiaolincoding.com/mysql/transaction/phantom.html#…
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 云原生周刊:Docker 推出 Docker Debug | 2023.10.9
开源项目推荐 SchemaHero SchemaHero 是一个 Kubernetes Operator,用于各种数据库的声明式架构管理。SchemaHero 有以下目标: 数据库表模式可以表示为可以部署到集群的 Kubernetes 资源。 可以编辑数据库模…