との取引が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;
..
この概念はSQLServerでは期待どおりに機能しますが、MySQLでは機能しません。私が間違っていることについて何か考えはありますか?
編集
display_orderにインデックスを追加しても、動作は変わりません。