zoukankan      html  css  js  c++  java
  • 「MySQL」InnoDB加锁情况

    主要讨论RR隔离级别,因为RC只是少了间隙锁。

    一、innodb七种锁

    共享/排他锁(Shared and Exclusive Locks)

    1. 共享锁(Shared Locks,S锁)
    2. 排他锁(Exclusive Locks,X锁)

    可以一起读,读写/写写互斥。

    意向锁(Intention Locks)

    1. 意向共享锁(intention shared lock,IS)
    2. 意向排它锁(intention exclusive lock,IX)

    看起来像表级锁,解决表级锁和行级锁的冲突。
    意向锁之间兼容。
    事务在请求S锁和X锁前,需要先获得对应的IS、IX锁。

    S X
    IS 兼容 互斥
    IX 互斥 互斥

    行锁

    记录锁(Record Locks)

    单条索引记录上加锁,record lock锁住的永远是索引,而非记录本身。如果没有显示索引,innodb会创建隐式的聚集索引。

    间隙锁(Gap Locks)

    锁住一个索引区间(开区间)。
    锁住索引记录的区间,或第一条索引记录之前的范围,或者最后一条索引记录之后的范围。

    临键锁(Next-Key Locks)

    记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间(左开右闭区间)。

    插入意向锁(Insert Intention Locks)

    一种特殊的间隙锁。
    两个事务只要插入的行没有冲突,即使在同一间隙,也可以插入。

    锁兼容矩阵

    Gap Insert Intention Record Next-Key
    Gap 兼容 兼容 兼容 兼容
    Insert Intention 冲突 兼容 兼容 冲突
    Record 兼容 兼容 冲突 冲突
    Next-Key 兼容 兼容 冲突 冲突

    存在Insert Intention 锁时,申请Gap锁是允许的;但是存在Gap锁时,申请Insert Intention锁时是被阻止的。

    自增锁(AUTO-INC Locks)

    表级锁,多个事务同时插入时,保证AUTO_INCREMENT列递增。

    二、Sql加锁情况

    普通select

    1.读未提交,读提交,可重复读 不加锁,快照读
    2.串行化,普通select会升级为 select … in share mode

    加锁select

    select … for update
    select … in share mode
    1.唯一索引,唯一条件 记录锁(Record Locks)
    2.其他的查询条件和索引条件 间隙锁(Gap Locks)与临键锁(Next-Key Locks)

    update与delete

    1.唯一索引,唯一条件 记录锁(Record Locks)
    2.其他, 排他临键锁(Next-Key Locks)

    insert

    排它锁 、同时,会在插入区间加插入 意向锁(insert intention lock)

    感谢:
    https://dev.mysql.com/doc/refman/5.5/en/innodb-locks-table.html
    https://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html#innodb-auto-inc-locks
    https://mp.weixin.qq.com/s/tmkRAmc1M_Y23ynduBeP3Q
    https://blog.csdn.net/zhanghongzheng3213/article/details/53436240
    http://narcissusoyf.iteye.com/blog/1637309

  • 相关阅读:
    EMC研究院电面记
    被百度放了鸽子
    最长严格递增子序列算法
    括号配对问题
    RTP 协议
    C++ 纯虚函数, 记上一笔!
    一年又一年
    direct3d Colorkey 应用.
    CEGUI 中文输入与显示
    被遗忘的C,记录一笔
  • 原文地址:https://www.cnblogs.com/ColdJk/p/14961535.html
Copyright © 2011-2022 走看看