锁的算法
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
默认行锁算法
按照左开右闭,锁住数据所在的区间和下一个区间。