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

标签 mysql

如果我正确理解这段代码

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/

相关文章:

mysql - 将 subselect sql 查询转换为 laravel 查询

css - mySQL + List - 如何使用 flexbox 水平显示

mysql - 数据库设计 - 困惑

mysql - SQL group by - 合并组

MySQL 对 2 个表的内部/外部连接进行更新

php - 如何将错误编码的数据转换为 UTF-8?

mysql - 基于递归的SQL语句

php - 你如何处理 ', single quote in person' 的名字在 php,javascript

php - 想要显示数据库中的图像信息

MySQL INT类型的5个字节?