Sunskey

日拱一卒,不期而至

0%

什么是幻读

什么是幻读

1.在可重复读的级别下,普通的查询时快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读“下才会出现。

2.上面sessionB的修改结果,被session A之后的select 语句用”当前读“看到,不能称为幻读。幻读仅专指”新插入的行“。

幻读有什么问题

1.破环了语义上的意思。”要把所有满足条件的行锁住,不准别的事务进行读写操作“

2.数据一致性的问题。

即使把所有的记录都加上锁,还是阻止不了新插入的记录。

如何解决幻读

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

就这样不止给数据库中已有的6个记录加上行锁,还同时加了7个间隙锁。这样确保了无法插入新的记录。

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

间隙锁和行锁合成next-key lock,每个next-key lock是前开后闭区间。例如:分别是 (-∞,0]、(0,5]、(5,10]、(10,15]、(15,20]、(20, 25]、(25, +supremum]。

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

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