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,它们在不同的事务中。 结果是T2select for update 被阻止。 根据https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.htmlselect for update 将在表上设置IX 锁,并且IXIX 兼容基于本文档中的锁兼容性矩阵。 那为什么第二个select for update 被第一个屏蔽了? 我搜索了一些关于这个问题的帖子,现在我也有以下相关问题:

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

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

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

    第二个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锁的分类:全局锁(数据备份)表级锁(表共享读锁表独占写锁元数据锁意向锁)行级锁(行锁间隙锁临键锁)

linux的flock命令(文件锁)

mysql插入意向锁测试

关于mysql 共享锁和排他锁 互斥问题?