如果我正确理解这段代码
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
之前不会发生 INSERT
和 UPDATE
?
最佳答案
您选择什么并不重要。 FOR UPDATE
锁定必须检查以评估 WHERE
子句的所有行。否则,另一个事务可能会更改其中提到的列,因此稍后的 UPDATE 将分配给不同的行。
并且由于插入新行可以更改MAX(field)
的值,因此它实际上锁定了整个表。当我尝试您的示例并尝试从另一个事务插入新事务时,第二个事务会阻塞,直到我提交第一个事务为止。
关于mysql - 事务期间的表锁包含 max(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433260/