【ふぁんとむりーど】
ファントムリード とは?
最終更新:
💡 同じ検索条件なのに、該当する行が変わる
同じトランザクション内で検索条件を変えずに再実行したとき、別のトランザクションのコミット済み変更により、条件を満たす行の集合が変わる現象。行数が同じでも、該当する行が入れ替わる場合がある。
📌 このページのポイント
ファントムリードって、何が変わるの?
行数が同じなら問題は起きていない?
行数だけでは判断できないよ。誰かが別の支店へ移り、別の人が東京へ移れば、2人のままでも該当する社員は入れ替わる。INSERTやDELETEだけでなく、条件に関係するUPDATEでも集合が変わるんだ。
ダーティリードやノンリピータブルリードとは違う?
ダーティリードは未確定の変更を読んでしまうこと。ノンリピータブルリードは読んだ行を再読したら変更されていること。ファントムリードでは、同じ検索条件に該当する行の集合が変わることに注目するよ。
Repeatable Readでも起きるの?
SQL標準では許されるけれど、DBMSによるよ。PostgreSQLのRepeatable Readでは防げる。Serializableでも防げるが、競合でトランザクションが失敗して再試行が必要になる場合がある。名前だけで判断せず、使うDBの仕様を確かめよう。
InnoDBのRepeatable Readで通常のSELECTを繰り返す場合は、同じスナップショットを読む仕組みで、読み取りによるロックはかけないよ。FOR UPDATEなどのロック付き読み取りでは、索引の行とその前の隙間を守るネクストキーロックが関係する。分離レベルや検索方法によってロック範囲は変わるんだ。
まとめ:ざっくりこれだけ覚えればOK!
「ファントムリード」って出てきたら「同じトランザクションで同じ条件を検索しても、該当する行が変わる現象」と思えばだいたいOK!
📖 おまけ:英語の意味
「Phantom Read」 = 幽霊読み取り
💬 phantom(幽霊)のように、突然現れたり消えたりする行のことだよ