mysql锁混乱

jv4diomz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(322)

MySQL5.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` 锁在table上,然后 `IX` 与兼容 `IX` 基于本文档中的锁兼容性矩阵。
那为什么是第二 `select for update` 被1挡了吗?
我搜索了一些关于这个问题的帖子,现在我也有以下与之相关的问题: `select for update` 将设置 `IX` 先放在table上,然后放好 `X` 在匹配索引/行上,对吗? `X` 以及 `S` 锁可以是表级的,也可以是行级的,对吗?
的锁型相容矩阵https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html,的 `X` 以及 `S` 意思是表级锁,而不是行级锁,对吗?
第二 `select for update` 阻止,因为 `select for update` 已设置 `IX` 在table上 `X` 在匹配的索引/行上,所以当 `select for update` 套 `IX` 在table上,可以。但是当它开始的时候 `X` 后者由于已设置而被阻止 `X` 到1号 `select for update` ,对吧?
wfauudbj

wfauudbj1#

“那么为什么第二次选择更新会被第一次阻止?”—因为这就是拥有独占(x)锁的关键所在。
对。
对。
是的。
正确的。

相关问题