美文网首页
2023-05-25

2023-05-25

作者: watermountain | 来源:发表于2023-05-24 10:57 被阅读0次

对“幻读”做一个说明:

  1. 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现。
  2. 上面session B的修改结果,被session A之后的select语句用“当前读”看到,不能称为幻读。幻读仅专指“新插入的行”。

产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。因此,为了解决幻读问题,InnoDB只好引入新的锁,也就是间隙锁(Gap Lock)。

跟行锁有冲突关系的是“另外一个行锁”。

但是间隙锁不一样,跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。间隙锁之间都不存在冲突关系。

间隙锁和行锁合称next-key lock,每个next-key lock是前开后闭区间。也就是说,我们的表t初始化以后,如果用select * from t for update要把整个表所有记录锁起来,就形成了7个next-key lock,分别是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +suprenum]。

间隙锁的引入,可能会导致同样的语句锁住更大的范围,这其实是影响了并发度的

间隙锁是在可重复读隔离级别下才会生效的。所以,你如果把隔离级别设置为读提交的话,就没有间隙锁了。

要解决可能出现的数据和日志不一致问题,需要把binlog格式设置为row。这,也是现在不少公司使用的配置组合。

其实我想说的是,配置是否合理,跟业务场景有关,需要具体问题具体分析

如果读提交隔离级别够用,也就是说,业务不需要可重复读的保证,这样考虑到读提交下操作数据的锁范围更小(没有间隙锁),这个选择是合理的。

读提交隔离级别加binlog_format=row的组合。

Q1: 大家都用读提交,可是逻辑备份的时候,mysqldump为什么要把备份线程设置成可重复读呢?

相关文章

  • 2023-05-25

    好久没有记录维尼的情况了,今天儿子在微信里提到这个,说想维尼了,让我把近期它的照片发过去。扒拉一番,才发觉...

网友评论

      本文标题:2023-05-25

      本文链接:https://www.haomeiwen.com/subject/ixifedtx.html