,Session C插入一行(1,1,5),因此Q3查询查出来的是id=0、1、5的这三行(0,0,5),(1,1,5),(5,5,5)
注意:上述Session A中查询都是当前读,关于当前读可以见MySQL...如何解决幻读?
产生幻读的原因就是行锁只能锁住行,插入动作更新的是记录之间的间隙。因此为了解决幻读问题,InnoDB引入了间隙锁。
什么是间隙锁?...where d = 8 for update;insert into t values(8,8,8)
insert into t values(8,8,8);
Session B的insert会被阻塞...(5,10)
Session Bz执行select for update同样也会加上间隙锁,间隙锁之间并不冲突,因此可以执行成功
Session B尝试插入(9,9,9),被Session A的间隙锁阻塞...间隙锁是在可重复读隔离级别下才会生效,如果将隔离级别设置为读提交,就不会有间隙锁了,但是同时需要解决数据和日志不一致的问题(需要把binlog格式设置为ROW)。