【问题标题】:MySQL lock confusionMySQL锁混乱
【发布时间】:2018-05-23 09:22:56
【问题描述】:

Mysql 5.6 Innodb 可重复读取隔离级别。

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

T1 先运行,再执行T2,它们在不同的事务中。

结果是T2select for update 被阻止。

根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.htmlselect for update 将在表上设置IX 锁,并且IXIX 兼容基于本文档中的锁兼容性矩阵。

那为什么第二个select for update 被第一个屏蔽了?

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

  1. select for update 会先在表上设置IX,然后在匹配索引/行上设置X,对吧?

  2. XS 锁可以是表级或行级的,对吧?

  3. https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html的锁类型兼容性矩阵中,XS是表级锁,不是行级锁,对吧?

  4. 第二个select for update被阻塞,因为第一个select for update在表上设置了IX,在匹配的索引/行上设置了X,所以当第二个select for update在表上设置IX时,就可以了.但是当它设置X后者时,它被阻止了,因为它已经被第一个select for update设置了X,对吧?

【问题讨论】:

  • 您的编辑听起来好像您已经想通了(大部分),您是对的,有两个不同的方面(表格和行),从文档中不是 100% 清楚(除非你已经知道它是如何工作的);我写了一个答案here,其中某个地方与该矩阵有类似的问题(它也可能会回答您的后续问题)。一般来说:T2 应该等待,这是正确的行为,您只需以适合的方式阅读文档。
  • @Solarflare 感谢您的回复。看了here的回答后我有一些问题,如果你能帮助我,不胜感激。

标签: mysql


【解决方案1】:

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

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

【讨论】:

  • 非常感谢。这个答案是我想要的:先用要点说是或否,然后如果你对每个点的回答是否定的,请解释细节。 MySQL doc 让我感到困惑,因为: 1. 也许我对包含大量信息的英文文档有误解 2. 它的文档在某些时候不清楚甚至误导。因此,我不确定我的理解是否 100% 正确。因此,我想向像您这样可以确定我的问题的人才确认我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
相关资源
最近更新 更多