MySQL如何解决幻读( 二 )

  • Session Bz执行select for update同样也会加上间隙锁,间隙锁之间并不冲突,因此可以执行成功
  • Session B尝试插入(9,9,9),被Session A的间隙锁阻塞,只好进入等待
  • Session A尝试插入(9,9,9),被Session B的间隙锁阻塞
  • 此时两个Session形成死锁等待,InnoDB的死锁检测发现死锁关系,让Session A的insert 语句报错返回 。
    间隙锁是在可重复读隔离级别下才会生效,如果将隔离级别设置为读提交,就不会有间隙锁了,但是同时需要解决数据和日志不一致的问题(需要把binlog格式设置为ROW) 。




    推荐阅读