mysql - MySQL锁混乱
问题描述
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,
将在表上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
andS
表示表级锁,而不是行级锁,对吗?第二个
select for update
阻塞,因为第一个select for update
已经设置IX
在表和X
匹配的索引/行上,所以当第二个select for update
设置IX
在表上时,就可以了。但是当它设置X
为后者时,它会被阻止,因为它已被设置X
为 1stselect for update
,对吧?
解决方案
“那为什么第二次选择更新被第一次阻止了?” - 因为这是拥有独占(X)锁的全部意义。
- 是的。
- 是的。
- 是的。
- 对。