当前位置: 代码迷 >> 综合 >> MySQL read-committed
  详细解决方案

MySQL read-committed

热度:47   发布时间:2024-02-27 01:13:39.0

Read Committed

含义:读已提交,一个事务只能看到其他并发的已提交的事务所作的修改。
特点:

  1. 不会出现脏读
    事务A:修改Table中数据为x,未提交
    事务B:读取Table中数据,x。
    事务A:rollback,并将x修改为y,提交。
    事务B:读取Table中数据,y。
    即读到了脏数据。

  2. 存在不可重复读
    事务A:读取Table中的数据,x。
    事务B:将x修改为y,提交。
    事务A:读取Table中数据,y。
    即在一个事务中同样的查询返回了不同结果。

  3. 存在幻读
    事务A:读取Table中的数据,查询到x条记录。
    事务B:在Table中新增了记录。
    事务A:读取Table中数据,同样查询条件查询到比x条记录多的记录。
    即在一个事务中同样的查询出现了之前不存在的记录。

  • 问题
  • 会造成一个事务中先产生的锁,无法锁住后加入的满足条件的行。
  • 产生数据一致性问题,在一个事务中,先对符合条件的目标行做变更,而在事务提交前有新的符合目标条件的行加入。这样通过binlog恢复的数据是会将所有符合条件的目标行都进行变更的。
  • 产生原因
  • 行锁只能锁住行,即使把所有的行记录都上锁,也阻止不了新插入的记录。
  • 解决方法
  • 将两行记录间的空隙加上锁,阻止新记录的插入;这个锁称为间隙锁。
  • 间隙锁与间隙锁之间没有冲突关系。跟间隙锁存在冲突关系的,是往这个间隙中插入一个记录这个操作。

幻读转载自:
作者:慧鑫coming
链接:https://www.jianshu.com/p/c53c8ab650b5
来源:简书

  相关解决方案