代码之家  ›  专栏  ›  技术社区  ›  frank

MySQL锁混淆

  •  1
  • frank  · 技术社区  · 7 年前

    mysql 5.6 innodb可重复读取隔离级别。

    T1                                        T2
    select ... where id = 1 for update
                                              select ... where id = 1 for update
    

    T1 先运行,然后执行 T2 ,它们是单独的交易。

    结果是 select for update 属于 T2 被阻止。

    根据 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html , 选择进行更新 将设置 IX 锁在桌子上,和 与兼容 基于本文中的锁兼容性矩阵。

    那为什么是第二个呢 选择进行更新 被第一个阻止了吗?

    我搜索了一些关于这个问题的帖子,现在我也有以下与之相关的问题:

    1. 选择进行更新 将设置 先在桌子上,然后坐 X 在匹配索引/行上,对吗?

    2. X S 锁可以是表级或行级,对吗?

    3. 在锁类型兼容矩阵中 https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html网站 , the X S 表示表级锁,而不是行级,对吗?

    4. 第二 选择进行更新 阻止,因为第一个 选择进行更新 已经设置 在桌子上和 X 在匹配的索引/行上,所以当第二个 选择进行更新 设置 在桌子上,没问题。但当它开始的时候 X 后一个,因为它已被设置而被阻止 X 第一 选择进行更新 ,对吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Vatev    7 年前

    “那么为什么第二次选择更新被第一次阻止?”-因为这就是拥有独占(X)锁的关键所在。

    1. 对。
    2. 对。
    3. 是的。
    4. 正确的。