我与 aSELECT
和 possible进行了交易INSERT
。出于并发原因,我添加FOR UPDATE
到SELECT
. 为了防止出现幻行,我使用了SERIALIZABLE
事务隔离级别。当表中有任何行时,这一切都可以正常工作,但如果表为空则不行。当表为空时,SELECT FOR UPDATE
不执行任何(排他性)锁定,并发线程/进程可以发出相同的问题SELECT FOR UPDATE
而不会被锁定。
CREATE TABLE t (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
display_order INT
) ENGINE = InnoDB;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
SELECT COALESCE(MAX(display_order), 0) + 1 from t FOR UPDATE;
..
这个概念在 SQL Server 上可以正常工作,但在 MySQL 上不行。关于我做错了什么的任何想法?
编辑
在 display_order 上添加索引不会改变行为。