gpt4 book ai didi

mysql - 两个事务无法在同一个表上获得 IX 锁,MySql

转载 作者:行者123 更新时间:2023-11-29 05:49:53 26 4
gpt4 key购买 nike

我有两个 session 这样做。

Session 1>start transaction;
Session 1>select * from account for update;

Session 2>start transaction;
Session 2>select * from account for update; //waiting.

既然 IX 锁与 IX 锁兼容,不应该 session 二也获得 IX 锁而无需等待。

即使是下面的一组语句也不起作用。

Session 1>start transaction;
Session 1>select * from account where i = 1 for update;

Session 2>start transaction;
Session 2>select * from account where i = 2 for update; //waiting.

隔离级别是Repeatable Read。这个隔离级别有什么不同吗?

兼容性来源 this

最佳答案

您显示的两个查询获取表的 IX 锁,它们彼此兼容。

但是 SELECT...FOR UPDATE 也会继续获取它检查的行上的 X 锁。这些都是冲突,这就是第二个 SELECT...FOR UPDATE 等待的原因。

在您的示例中,一个查询针对行WHERE i = 1,另一个查询针对行WHERE i = 2,它们不会返回相同的行,但是如果 i 没有索引,它们将检查一组重叠的行。检查行意味着 InnoDB 获取行,然后根据 WHERE 子句中的条件测试它们。根据条件,它可能会跳过它检查的某些行,并且只返回检查的行(如果它们测试为真)。

如果您在 i 上有一个索引,InnoDB 可以排除不匹配的行而不检查这些行。在这些条件下,您的示例将不会显示冲突。

Session 1>ALTER TABLE account ADD INDEX (i);

Session 1>start transaction;
Session 1>select * from account where i = 1 for update;

Session 2>start transaction;
Session 2>select * from account where i = 2 for update; // does NOT wait

关于mysql - 两个事务无法在同一个表上获得 IX 锁,MySql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com