Read Committed
含义:读已提交,一个事务只能看到其他并发的已提交的事务所作的修改。
特点:
-
不会出现脏读:
事务A:修改Table中数据为x,未提交
事务B:读取Table中数据,x。
事务A:rollback,并将x修改为y,提交。
事务B:读取Table中数据,y。
即读到了脏数据。 -
存在不可重复读:
事务A:读取Table中的数据,x。
事务B:将x修改为y,提交。
事务A:读取Table中数据,y。
即在一个事务中同样的查询返回了不同结果。 -
存在幻读
事务A:读取Table中的数据,查询到x条记录。
事务B:在Table中新增了记录。
事务A:读取Table中数据,同样查询条件查询到比x条记录多的记录。
即在一个事务中同样的查询出现了之前不存在的记录。
- 问题
- 会造成一个事务中先产生的锁,无法锁住后加入的满足条件的行。
- 产生数据一致性问题,在一个事务中,先对符合条件的目标行做变更,而在事务提交前有新的符合目标条件的行加入。这样通过binlog恢复的数据是会将所有符合条件的目标行都进行变更的。
- 产生原因
- 行锁只能锁住行,即使把所有的行记录都上锁,也阻止不了新插入的记录。
- 解决方法
- 将两行记录间的空隙加上锁,阻止新记录的插入;这个锁称为间隙锁。
- 间隙锁与间隙锁之间没有冲突关系。跟间隙锁存在冲突关系的,是往这个间隙中插入一个记录这个操作。
幻读转载自:
作者:慧鑫coming
链接:https://www.jianshu.com/p/c53c8ab650b5
来源:简书