ファントムリード
同一トランザクション内で同じクエリを実行したのに、結果が変わる現象
具体例
code:sql
-- Trx1: 商品検索トランザクション
BEGIN;
SELECT * FROM products WHERE price BETWEEN 1000 AND 2000;
-- 結果: 3件
-- Trx2: 新商品を追加
INSERT INTO products (name, price) VALUES ('新商品', 1500);
COMMIT;
-- Trx1で再度同じクエリを実行
SELECT * FROM products WHERE price BETWEEN 1000 AND 2000;
-- 結果: 4件 ← 1件増えた
範囲検索(BETWEEN、 >、 <)を利用し、新しいレコードがその範囲内に出現する時に発生
解決方法
※InnoDBの話
既存レコード感の空白部分をロック
新レコード挿入を防止
トランザクション分離レベル別の動作
table:レベル別
分離レベル ファントムリード
READ UNCOMMITTED 発生する
READ COMMITTED 発生する
REPEATABLE READ 発生しない
SERIALIZABLE 発生しない