Mysql 5.6 Innodb可重复读取隔离级别。
T1 T2
select ... where id = 1 for update
select ... where id = 1 for update
首先运行 T1
,然后执行T2
,它们处于单独的事务中。
结果是select for update
T2
被阻止。
根据{{3}},
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
后者时,它会被屏蔽,因为它已被X
设置为select for update
,对吗?
答案 0 :(得分:1)
"那么为什么第二次选择更新会被第一次阻止?" - 因为这是拥有独占(X)锁定的重点。