如果我正确理解了这段代码
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 ;
现在不再有效。
如何在事务期间锁定表,以使INSERT
和UPDATE
都不能在COMMIT
之前发生?
答案 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
的值,因此它实际上锁定了整个表。当我尝试您的示例并尝试从另一个事务中插入新事务时,第二个事务将阻塞,直到我提交第一个事务为止。