mvcc和间隙锁

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

你可能感兴趣的:(mysql)