锁的算法

InnoDB存储引擎有3种行锁的算法,

  • Record Lock:记录锁,单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
  • Next-Key Lock:临键锁,Record Lock + Gap Lock,锁定一个范围,并且锁定记录本身。

Record Lock

Record Lock总是会去锁住索引记录,如果InnoDB存储引擎表在建立的时候没有设置

任何一个索引,那么这时InnoDB存储引擎会使用隐式的主键来进行锁定。

索引需要是主键索引或唯一索引

Gap Lock

为了阻止在多个事务将记录插入到同一范围内,导致Phantom Problem(幻读),

指在同一事务下, 连续执行两次同样的SQL语句可能导致不同的结果,

第二次的SQL语句可能返回之前不存在的行。

锁定范围不包含锁定记录本身,假设有1,3,10,三个索引值,锁定记录为3,

则锁定范围为:(1,3)、(3,10)。

关闭Gap Lock可通过将事务的隔离级别设置为READ_COMMITTED、将参数innodb_locks_unsafe_for_binlog设置为1。

Next-Key Lock

默认行锁算法

按照左开右闭,锁住数据所在的区间和下一个区间。