交易期间的表锁定包含max()

时间:2019-06-03 19:11:23

标签: 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影响的行。但这不会锁定表格。含义

INSERT INTO table() VALUES();
不管COMMIT

仍然可以发生。 那将意味着

的返回值
SELECT MAX(field) FROM table WHERE ... FOR UPDATE ;

现在不再有效。

如何在事务期间锁定表,以使INSERTUPDATE都不能在COMMIT之前发生?

1 个答案:

答案 0 :(得分:0)

选择什么都没关系。 const锁定所有必须检查以评估 byte cSec; boolean contCSec = true; while(contCSec == true) { System.out.println("Enter course section: "); cSec = sc.nextByte(); if(cSec>0) contCCode = false; } 子句的行。否则,另一笔交易可能会更改此处提到的列,因此后面的FOR UPDATE将分配给不同的行。

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