gpt4 book ai didi

mysql - Mysql中的行级锁定

转载 作者:可可西里 更新时间:2023-11-01 06:47:45 25 4
gpt4 key购买 nike

我在一个表中有 5 行(1 到 5)。我希望第 2 行锁定一些更新,同时如果有人试图更新第 4 行,那么他应该能够更新。

我正在用下面的代码尝试这个,但我觉得它是在表级别而不是行级别放置锁。

------ 第 1 节

START TRANSACTION;
SELECT * FROM test WHERE t=1 FOR UPDATE;
UPDATE test SET NAME='irfandd' WHERE t=2;
COMMIT;

----- session 2(被阻止)

START TRANSACTION;
UPDATE test SET NAME='irfandd' WHERE t=4;
COMMIT;

最佳答案

使用 LOCK IN SHARE MODE 代替 FOR UPDATEFOR UPDATE 也阻止其他事务读取该行。 LOCK IN SHARE MODE 允许读取,但阻止更新。

引用:MySQL Manual

------ 第 1 节

START TRANSACTION;
SELECT * FROM test WHERE t=1 LOCK IN SHARE MODE;
UPDATE test SET NAME='irfandd' WHERE t=2;
COMMIT;

----- session 2(不再被阻止:))

START TRANSACTION;
UPDATE test SET NAME='irfandd' WHERE t=4;
COMMIT;

更新:

意识到 表在 t 上没有索引,我有以下解释:

首先,事务 T1 锁定 行 1 SELECT * FROM test WHERE t=1 FOR UPDATE

接下来,事务 T2 尝试执行 UPDATE test SET NAME='irfandd' WHERE t=4。要找出受影响的行,它需要扫描所有行,包括第 1 行。但那是锁定的,所以 T2 必须等到 T1 完成。如果有任何类型的索引,WHERE t=4 可以使用索引来决定row 1 是否包含t=4,所以无需等待。

选项 1:test.t 上添加索引,以便您的更新可以使用它。

选项 2:使用 LOCK IN SHARE MODE,它仅用于设置读取锁定。不幸的是,这个选项会造成死锁。有趣的是,T2 事务执行(更新第 4 行),而 T1 失败(更新第 2 行)。似乎 T1 也对 第 4 行 进行了读取锁定,并且由于 T2 对其进行了修改,因此 T1 由于事务隔离级别 (REPEATABLE READ by default) 而失败。最终的解决方案是玩 Transaction Isolation Levels ,使用 READ UNCOMMITTEDREAD COMMITTED 事务级别。

恕我直言,最简单的是选项 1,但这取决于您的可能性。

关于mysql - Mysql中的行级锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33800234/

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