关于mysql:mvcc和间隙锁

3次阅读

共计 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#…

正文完
 0