У меня есть транзакция с SELECT
и возможно 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. Есть идеи, что я делаю не так?
EDIT
Добавление индекса на display_order не меняет поведение.