Innodb使用MVCC和next-key locks(行锁与间隙锁组合)解决幻读。MVCC(多版本并发控制)解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。
快照读(snapshot read):简单的select操作。
当前读(current read):适用于 insert,update,delete, select ... for update, select ... lock in share mode 语句,以及加锁了的 select 语句。
行锁:针对单个行记录加锁
间隙锁:(Gap Locking):可锁住索引之间的空隙。
Next-Key :帮我们锁住一个范围,同时锁住记录本身。
假设表里面id有3,4,5,事务A读取了id>3的数据之后,事务B无法插入id=6的数据,这是因为采用了 Next-Key 锁,4,5及后面的数字都会被锁定, 就无法插入符合这个范围的数据了. 然后事务A重新进行条件范围的查询,就不会出现幻读的情况。
参考:
https://zhuanlan.zhihu.com/p/147574923