MySQL锁混乱
Posted
技术标签:
【中文标题】MySQL锁混乱【英文标题】:MySQL lock confusion 【发布时间】: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
,它们在不同的事务中。
结果是T2
的select for update
被阻止。
根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html,
select for update
将在表上设置IX
锁,并且IX
与IX
兼容基于本文档中的锁兼容性矩阵。
那为什么第二个select for update
被第一个屏蔽了?
我搜索了一些关于这个问题的帖子,现在我也有以下相关问题:
select for update
会先在表上设置IX
,然后在匹配索引/行上设置X
,对吧?
X
和S
锁可以是表级或行级的,对吧?
在https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html的锁类型兼容性矩阵中,X
和S
是表级锁,不是行级锁,对吧?
第二个select for update
被阻塞,因为第一个select for update
在表上设置了IX
,在匹配的索引/行上设置了X
,所以当第二个select for update
在表上设置IX
时,就可以了.但是当它设置X
后者时,它被阻止了,因为它已经被第一个select for update
设置了X
,对吧?
【问题讨论】:
您的编辑听起来好像您已经想通了(大部分),您是对的,有两个不同的方面(表格和行),从文档中不是 100% 清楚(除非你已经知道它是如何工作的);我写了一个答案here,其中某个地方与该矩阵有类似的问题(它也可能会回答您的后续问题)。一般来说:T2 应该等待,这是正确的行为,您只需以适合的方式阅读文档。 @Solarflare 感谢您的回复。看了here的回答后我有一些问题,如果你能帮助我,不胜感激。 【参考方案1】:“那为什么第二次选择更新被第一次阻止了?” - 因为这是拥有独占 (X) 锁的全部意义所在。
-
是的。
是的。
是的。
对。
【讨论】:
非常感谢。这个答案是我想要的:先用要点说是或否,然后如果你对每个点的回答是否定的,请解释细节。 MySQL doc 让我感到困惑,因为: 1. 也许我对包含大量信息的英文文档有误解 2. 它的文档在某些时候不清楚甚至误导。因此,我不确定我的理解是否 100% 正确。因此,我想向像您这样可以确定我的问题的人才确认我的问题。以上是关于MySQL锁混乱的主要内容,如果未能解决你的问题,请参考以下文章
Mysql加锁过程详解-innodb下的记录锁,间隙锁,next-key锁
Mysql加锁过程详解-innodb下的记录锁,间隙锁,next-key锁
MySQL 进阶 锁 -- MySQL锁概述MySQL锁的分类:全局锁(数据备份)表级锁(表共享读锁表独占写锁元数据锁意向锁)行级锁(行锁间隙锁临键锁)