什么是幻读,幻读会有什么问题

2021年9月4日 7点热度 0条评论 来源: qq_34709713

什么是幻读?

幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。
“幻读”做一个说明:

  1. 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在当前读下才会出现。
  2. 第二次查看,发现被修改的“行”,不能称为幻读,幻读仅专指“新插入的行”。

当前读:也叫即时读,就是忽略版本控制,读取最新的数据。

幻读有什么问题?

  1. 首先是语义上的
  2. 是数据一致性的问题。

如何解决幻读问题?

读锁是行锁,无法解决幻读问题,因此引入间隙锁(GAP锁)

  1. 间隙锁和锁之间不存在冲突关系。
  2. 跟间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。
  3. 间隙锁和行锁合称 next-key lock,每个 next-key lock 是前开后闭区间。
  4. 间隙锁的引入,可能会导致同样的语句锁住更大的范围,这其实是影响了并发度的。

如何解决间隙引发的并发锁问题?

间隙锁是在可重复读隔离级别下才会生效的。所以,你如果把隔离级别设置为读提交的话,就没有间隙锁了。但同时,你要解决可能出现的数据和日志不一致问题,需要把 binlog 格式设置为 row。

mysqldump 为什么要把备份线程设置成可重复读呢?

当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。

间隙锁

如果在唯一索引上面使用等值查询,间隙锁会退化成行锁。

在删除数据的时候尽量加 limit。这样不仅可以控制删除数据的条数,让操作更安全,还可以减小加锁的范围。

    原文作者:qq_34709713
    原文地址: https://blog.csdn.net/qq_34709713/article/details/108819480
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。