gpt4 book ai didi

mysql - 事务期间的表锁包含 max()

转载 作者:行者123 更新时间:2023-11-29 15:56:25 25 4
gpt4 key购买 nike

如果我正确理解这段代码

START TRANSACTION;
SELECT field FROM table WHERE ... FOR UPDATE ; // single row
UPDATE table SET field = ... ;
COMMIT;

将锁定SELECT行,直到COMMIT

但是如果我使用MAX()

START TRANSACTION;
SELECT MAX(field) FROM table WHERE ... FOR UPDATE ; // whole table
UPDATE table SET field = ... ;
COMMIT;

这段代码会锁定整个表直到COMMIT吗?

编辑

抱歉,我的问题有误。显然,上面的代码将锁定受 WHERE 影响的行。但它不会锁定 table 。含义

INSERT INTO table() VALUES();

无论COMMIT如何,仍然可能发生。这意味着返回值

SELECT MAX(field) FROM table WHERE ... FOR UPDATE ;

现已不再有效。

如何在事务期间锁定表,以便在 COMMIT 之前不会发生 INSERTUPDATE

最佳答案

您选择什么并不重要。 FOR UPDATE 锁定必须检查以评估 WHERE 子句的所有行。否则,另一个事务可能会更改其中提到的列,因此稍后的 UPDATE 将分配给不同的行。

并且由于插入新行可以更改MAX(field)的值,因此它实际上锁定了整个表。当我尝试您的示例并尝试从另一个事务插入新事务时,第二个事务会阻塞,直到我提交第一个事务为止。

关于mysql - 事务期间的表锁包含 max(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433260/

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