• 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

  • 相关阅读:
    jquery防冲突的写法
    easyUI.checkForm
    获取树形节根节点下面所有层级子节点
    自动发布web应用程序或者网站
    MVC UI Jquery
    Linq模糊查询
    常用正则表达式示例
    Easy UI中,当批量操作后,移除总复选框的选中状态
    常用的JS
    检查是否安装或运行了IIS服务
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351223.html
Copyright © 2020-2023  润新知