在默认的事务隔离级别:可重复度(repeatable read),InnoDB采用Next-Key Locking机制来避免幻读问题(Phanton Problem)。

1、幻读的定义

指在同一事务下,连续执行两次同样的SQL语句,可能导致不同的结果,第二次的SQl语句可能会返回之前不存在的行。

2、例子

假设表t有一个值1、2、3、4、5组成。
此时事务T1执行SQL:

1
select * from t where id>3;

结果返回4和5,这时事务没有提交。
事务T2,向表中插入了一个6。

这时T1又执行了一个查询,发现结果为4、5、6,产生了幻读。

3、解决办法

使用Next-Key Locking机制,来避免幻读。
行锁有三种算法:

  • Record Lock
    单个行记录上的锁,会去锁定索引记录。
  • Gap Lock
    间隙所,锁定一个范围,但是不包含记录本身。
  • Next-Key Lock
    上面两种锁的结合,锁定一个范围和记录本身,InnoDB中行的查询都采用这种锁定算法。
    采用Next-Key Lock的锁定技术称为Next-Key Lokong。

参考

MySQL 加锁处理分析

tencent.jpg