14.2.2.4 InnoDB Record, Gap, and Next-Key Locks
InnoDB 有几种类型的行级锁 包括record locks, gap locks, and next-key locks.
关于共享锁,排他锁和intention locks, see Section 14.2.2.1, “InnoDB Lock Modes”.
1.record lock: 这个是在Index record 锁
2.Gap lock: 间隙锁 这是一个锁在一个间隙 在index records之间,
或者一个锁在一个间隙 在第一个或者而最后一个Index record 的后面
3.Next-key lock: 这是record lock 在index record 的组合,一个gap lock 在间隙上在Index record 之前。
Record Locks:
Record locks 总是lock index records, 即使如果一个表被定义为没有indexes.
对于这样的情况,InnoDB 创建一个隐藏的 clustered index和使用这个索引用于record locking.
See Section 14.2.6.2, “Clustered and Secondary Indexes”.
Next-key Locks
默认的,InnoDB 操作 在 REPEATABLE READ 事务隔离级别 , innodb_locks_unsafe_for_binlog 系统变量禁用。
在这种情况下, InnoDB 使用 next-key locks用于搜索和index扫描,
以防止幻影行(见第14.2.2.5,避免“虚位的问题用下键锁定”)。
Next-key locking 结合 index-row locking 。
InnoDB 执行一个row-level locking 以这种方式当它搜索或者扫描一个表的索引,
它设置共享或者排他锁在Index records.
因此,row-level locks 实际上是index-record locks.
此外,一个 next-key lock 在一个Index record 也影响the “gap” .
也就是说, a next-key lock 是一个index-record lock 加上一个gap lock 。
如果一个会话有一个共享的或者排它的锁在记录R 在一个索引里,
另外一个会话不能插入一个新的index record 在gap .
假设 一个Index 包含值10, 11, 13, and 20. 可能的next-key locks 对于这个索引副高下面的间隔,
在最后一个区间, next-key lock 锁住gap 在最大的值上
Gap Locks
next-key locking 例子在先前的章节 显示一个gap 可能跨越一个单独的index value,
多个Index value 或者甚至是空的。
区间锁 对于语句锁住记录使用一个唯一的索引是不需要的 来搜索一个唯一值。
(这个不包括所有条件值只包含多列唯一索引的一些列,在这种情况下,间隙锁确实发生)
比如,如果Id 列有一个唯一的索引,下面的语句只使用一个index-record lock 用于记录id值为100
SELECT * FROM child WHERE id = 100;
如果id 没有被索引或者没有一个 nonunique index, 语句 锁定前面的gap
一种类型的gap lock 称为一个Insert t intention gap lock 是被设置通过INSERT 操作优先于行插入。
lock 发信号意图插入以这样的方式,多个事务插入相同的Index gap 不需要等待对于每个其他的如果它们
它们不是插入在相同的位置。
假设这里有index records 值为4和7,单独的事务尝试插入值5和6 每个lock 间隙在4和7
插入 intention locks 优先的 得到排它锁在被插入的记录,但是不堵塞每个其他的因为记录是不冲突的。
同样值得注意的是,冲突锁可以持有在一个gap 通过不同的事务。
比如, 事务A 可以持有一个共享的gap lock(gap S-lock) 在一个gap
当事务B 持有一个排他的gap lock(gap X-lock)在同样的gap.
Disabling Gap Locking:
Gap locking 可以被显示的禁用, 这个发生在如果你改变了事务的隔离级别为 READ COMMITTED
或者启用innodb_locks_unsafe_for_binlog system variable