【问题标题】:MySQL lock compatibilityMySQL 锁兼容性
【发布时间】:2018-01-18 21:14:28
【问题描述】:

根据here的官方文档:

锁兼容性矩阵:

    X              IX          S         IS
X   Conflict    Conflict    Conflict    Conflict
IX  Conflict    Compatible  Conflict    Compatible
S   Conflict    Conflict    Compatible  Compatible
IS  Conflict    Compatible  Compatible  Compatible

文档还说:

因此,意图锁不会阻塞除全表请求之外的任何内容 (例如,LOCK TABLES ... WRITE)。 IX和IS的主要目的 locks 是显示某人正在锁定一行,或者将要锁定一行 在表中。

如果意图锁只阻塞全表请求,那么如何解释上述锁兼容性矩阵中的IX与S锁冲突?据我了解,锁兼容性矩阵中的S和X都是记录锁,对吗?

【问题讨论】:

    标签: mysql locking


    【解决方案1】:

    据我了解,锁兼容性矩阵中的S和X都是记录锁,对吗?

    没错。不正确的是您可以直接比较表和记录锁的假设,文档可能没有完全清楚,并且“这些规则可以通过以下锁类型兼容性矩阵方便地总结”部分可能有点误导,因为它没有涵盖所有内容(即关于 S/X-table 锁和 record 锁的任何冲突信息)。

    从技术上讲,该矩阵定义了检查某个对象上的锁时的结果,例如每当 MySQL 尝试为某物添加锁时。如果您尝试在一个表上获得S 锁,它将与该表上的IX 锁相冲突。

    如果一条记录可以有意向锁,它也会在那里发生冲突。仅仅因为可锁定对象不使用意图锁不会改变(一般)兼容性矩阵。

    从技术上讲,锁的内部数据类型对于记录和表是相同的,只是从不为记录设置意图锁。记录锁实际上永远不会与表锁进行比较(因为它们是两个不同的对象),记录锁干扰表锁的唯一原因是锁定协议(它需要同时锁定表和记录锁定记录)。

    所以要锁定一条记录,您通常需要一个不同的表锁。兼容性矩阵是相同的,但表的值可以并且通常会与记录的值不同。

    所以

    因此,意图锁不会阻塞除全表请求(例如,LOCK TABLES ... WRITE)之外的任何内容。

    是正确的,因为只有全表请求需要与现有意向锁冲突的锁,并且记录不使用意向锁。但是要重复一遍:您仍然必须比较两个不同的锁。记录上的S-lock 不能与表上的锁冲突,因为这两个对象永远不会被比较。

    手册是混合表和记录锁的。它实际上将IS 和IX 定义为:

    • 意图共享 (IS):事务 T 打算在表 t 中的各个行上设置 S 锁。
    • 意图排他 (IX):事务 T 打算在这些行上设置 X 锁。

    因此,如果您愿意,矩阵中的IS 和IX 在某种程度上可以解释为行的属性(从技术上讲,它们不是),而您将它们读作表上的锁(因为它只能是为一个表设置,但这是一个不同的锁)。但是该矩阵仍然只描述比较记录的情况(手册可能不够清楚),并且它不包含与S的任何兼容性信息或X table 锁。

    所以总结一下:你不需要“在上面的锁兼容性矩阵中解释 IX 与 S 锁的冲突”,因为它根本不包括那种情况。

    【讨论】:

    • 1. S 和 X 只锁定行级锁,或者它们可以是表级和行级。 2.你说To my understanding, the S and X in the lock compatibility matrix are both record locks, it's that right?是正确的,所以你的意思是S和X是MySQL关于锁兼容性矩阵的文档中的行级锁,对吧?因为在我的post 中,Vatev 说它们是锁兼容性矩阵中的表级锁,而你说它们是行级锁。
    猜你喜欢
    • 2021-12-12
    • 2017-02-20
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多