【ふぁんとむりーど】
ファントムリード とは?
💡 さっきなかった行が幽霊みたいに現れた!
📌 このページのポイント
- 同じSELECTを2回実行したのに、他トランザクションのINSERT/DELETEで行数が変わる
- Repeatable Read分離レベルでも理論上は発生しうる(DBMSの実装による)
- Serializable分離レベルで完全に防止できる
- MySQLのInnoDBではRepeatable Readでもギャップロックによりファントムリードを防止する
ファントムリードって幽霊っぽい名前だけど、何が怖いの?
同じ検索条件でSELECTを実行したのに、1回目と2回目で結果の行数が変わっちゃう現象だよ。たとえば「東京支店の社員一覧」を取得したら10人だったのに、もう一度取得したら11人になってた、みたいなことが起きるんだ
えっ、同じトランザクションの中で変わるの?
ダーティリードとはどう違うのかな?
どうやって防ぐの?
一番確実なのはSerializable分離レベルに設定することだよ。ただしMySQLのInnoDBではRepeatable Readでもギャップロックという仕組みでファントムリードを防いでくれるんだ。これはInnoDBの賢い実装のおかげだね
ギャップロックって何なの?
検索範囲の「隙間」にもロックをかける仕組みだよ。たとえばID 10〜20の範囲を検索したら、その隙間にも新しい行が入れないようにロックするんだ。だから幽霊行が現れなくなるんだよ
まとめ:ざっくりこれだけ覚えればOK!
「ファントムリード」って出てきたら「同じ検索なのに幽霊みたいに行が増減する問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Phantom Read」 = 幽霊読み取り
💬 phantom(幽霊)のように、突然現れたり消えたりする行のことだよ