【发布时间】:2011-01-12 12:30:00
【问题描述】:
我与SELECT 和可能的INSERT 进行了交易。出于并发原因,我在SELECT 中添加了FOR UPDATE。为了防止出现幻行,我使用了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 上添加索引不会改变行为。
【问题讨论】:
标签: mysql transactions innodb isolation-level