【ふぁんとむりーど】

ファントムリード とは?

💡 さっきなかった行が幽霊みたいに現れた!
📌 このページのポイント
ファントムリード(行数が変わる問題) 1回目のSELECT 田中(東京支店) 佐藤(東京支店) → 2件 別トランザクション INSERT 鈴木(東京) 2回目のSELECT 田中(東京支店) 佐藤(東京支店) 鈴木(東京支店)← 幽霊行! 同じ条件なのに結果が変わった!
ファントムリードのイメージ
ひよこ ひよこ

ファントムリードって幽霊っぽい名前だけど、何が怖いの?

ペンギン先生 ペンギン先生

同じ検索条件でSELECTを実行したのに、1回目と2回目で結果の行数が変わっちゃう現象だよ。たとえば「東京支店の社員一覧」を取得したら10人だったのに、もう一度取得したら11人になってた、みたいなことが起きるんだ

ひよこ ひよこ

えっ、同じトランザクションの中で変わるの?

ペンギン先生 ペンギン先生

そう。別のトランザクションが新しい行をINSERTしたりDELETEしたりすると、自分のトランザクション内でも影響を受けちゃうことがあるんだよ

ひよこ ひよこ

ダーティリードとはどう違うのかな?

ペンギン先生 ペンギン先生

ダーティリードは「未確定のデータを読む」問題で、ファントムリードは「確定済みだけど行の数が変わる」問題だよ。どちらもトランザクション分離の問題だけど、レベルが違うんだ

ひよこ ひよこ

どうやって防ぐの?

ペンギン先生 ペンギン先生

一番確実なのはSerializable分離レベルに設定することだよ。ただしMySQLのInnoDBではRepeatable Readでもギャップロックという仕組みでファントムリードを防いでくれるんだ。これはInnoDBの賢い実装のおかげだね

ひよこ ひよこ

ギャップロックって何なの?

ペンギン先生 ペンギン先生

検索範囲の「隙間」にもロックをかける仕組みだよ。たとえばID 10〜20の範囲を検索したら、その隙間にも新しい行が入れないようにロックするんだ。だから幽霊行が現れなくなるんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ファントムリード」って出てきたら「同じ検索なのに幽霊みたいに行が増減する問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Phantom Read」 = 幽霊読み取り
💬 phantom(幽霊)のように、突然現れたり消えたりする行のことだよ
← 用語集にもどる