InnoDB存储引擎默认的隔离级别是REPEATABLE READ(可重复度),并且使用next-key lock锁的算法,避免了幻读的产生

幻读:在同一事物下,连续执行同样的sql语句可能导致不同的结果,第二次的sql语句可能会返回之前不存在的行。例如在一个事物中运行两次同样的sql,

select * from t where a > 2 for update;

若第二次运行上述sql之前,其他事物插入了a>2的记录,则第二次返回的结果可能与第一次不同,这就是幻读

key-range-locking算法是谓词锁的改进实现,其锁定的不是条件,而是范围,根据锁定的边界不同,又可以分为next-key-locking和previous-key-locking。

假设有记录W、Y、Z,根据next-key算法,可以锁定的范围有
(-∞,W],(W,Y],(Y,Z],(Z,+∞)
若插入记录X,则可锁定的范围变为:
(-∞,W],(W,X],(X,Y],(Y,Z],(Z,+∞)
因此在next-key locking算法下,锁定的不是记录,而是一个范围,例如锁定记录Y其实锁定的是(W,Y]这个范围,当这个范围被锁定时会阻止其他事物向这个范围插入新的记录,从而避免了幻读问题的产生