14.2.2.4 InnoDB Record, Gap, and Next-Key Locks

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

原文地址:https://www.cnblogs.com/hzcya1995/p/13351223.html