ファントムリードは、データベースのトランザクション処理で発生する異常現象の一つです。応用情報技術者やデータベーススペシャリストの学習で登場するこの用語を、日常の例え話と図解で整理します。
対象試験と出題頻度
ファントムリードは、応用情報技術者で出題されるテーマです。
単独で問われるよりも、排他制御やトランザクション分離レベルの比較問題の一部として登場するケースが中心です。
詳細をクリックして確認
応用情報技術者
★☆☆☆☆
ランクD(発展)参考程度
用語の定義
情報処理試験を勉強していると、「ダーティリード・ノンリピータブルリード・ファントムリードって何が違うの?」と混乱しがちです。
ファントムリード(Phantom Read)とは、一言で言うと
「同一トランザクション内で同じ検索を2回実行したとき、1回目には存在しなかった行が2回目に出現する異常」
のことです。
イメージとしては、「教室で出席を取ったら、2回目の点呼で知らない生徒が増えていた」という状況です。
最初に数えたときは30人だったのに、もう一度数えたら31人いる。
この”いつの間にか増えた幽霊のような行”がファントム(Phantom=幻影)と呼ばれる由来です。
📊 ファントムリードの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Phantom Read |
| 分類 | トランザクション同時実行時の異常現象 |
| 発生原因 | 別トランザクションによるINSERT(またはDELETE)のコミット |
| 防止できる分離レベル | SERIALIZABLE |
| 関連する異常 | ダーティリード、ノンリピータブルリード |
解説
DBMSは複数のトランザクションを同時に実行して処理効率を高めています。
しかし、この同時実行が原因で、データの読み取り結果に不整合が生じる場合があります。
この不整合には3種類あり、ファントムリードはその中で「行数の変化」に着目した異常です。
発生メカニズム
具体的にどのような手順で起きるのかを、数学模試の成績テーブルを例に示します。
ファントムリードの発生手順
トランザクション T1
(平均点を算出したい)
トランザクション T2
(A君の成績を登録したい)
結果:T1は合計点を3人分で取得した後、受験者数を数え直したら4人になっていた。240 ÷ 4 = 60点という誤った平均点が算出される(正しくは 240 ÷ 3 = 80点、または 295 ÷ 4 = 73.75点)。
ポイントは、ノンリピータブルリードが「既存行の値が変わる」現象であるのに対して、ファントムリードは「行そのものが増減する」現象である点です。
UPDATE(更新)ではなくINSERTやDELETEが原因になるという違いがあります。
3つの異常現象の比較
トランザクション同時実行で発生する3種類の異常を整理します。
| 異常名 | 何が起きるか | 原因となる操作 |
|---|---|---|
| ダーティリード | コミット前の未確定データを読み取ってしまう | 他トランザクションの未コミットUPDATE/INSERT |
| ノンリピータブルリード | 同じ行を2回読んだら値が変わっている | 他トランザクションのコミット済みUPDATE |
| ファントムリード | 同じ条件で検索したら行数が変わっている | 他トランザクションのコミット済みINSERT/DELETE |
分離レベルとの対応
ANSI/ISO SQL標準では、トランザクションの隔離性水準を4段階に分けています。
分離レベルを上げるほど異常は防げますが、その分ロックが厳しくなり処理性能は低下します。
📊 分離レベルと異常の発生可否
| 分離レベル | ダーティリード | ノンリピータブルリード | ファントムリード |
|---|---|---|---|
| READ UNCOMMITTED | 発生する | 発生する | 発生する |
| READ COMMITTED | 防止 | 発生する | 発生する |
| REPEATABLE READ | 防止 | 防止 | 発生する |
| SERIALIZABLE | 防止 | 防止 | 防止 |
※ ANSI/ISO SQL標準の定義。DBMS製品によっては、REPEATABLE READでもファントムリードを防止する実装がある(MySQL InnoDBなど)。
ここだけは確実に押さえてください。
REPEATABLE READでは「行の値」は保護されるが「行の増減」は保護されない、つまりファントムリードだけが唯一残る異常です。全ての異常を完全に遮断するにはSERIALIZABLEが必要になります。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 ファントムリードの核心を3行で
・同じ条件で2回検索したとき、行数が増減する異常現象
・原因は別トランザクションによるINSERT/DELETEのコミット
・REPEATABLE READでは防げず、SERIALIZABLEで初めて防止できる
試験ではこう出る!
ファントムリード単独の出題はAP午前ではまれですが、DB(データベーススペシャリスト)午前IIではトランザクション分離レベルと絡めて繰り返し出題されています。AP受験者も、DB午前IIの問題がAP午前に流用されることがあるため、押さえておいて損はありません。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| DB H29春 午前II 問17 |
探索条件に合致するデータをINSERTした結果、平均点の算出が狂う事象を選ぶ問題。 | ・2回のSELECTの間に行が挿入された結果を「ファントムリード」と判断させる ・ひっかけにアンリピータブルリード、ダーティリードが並ぶ |
| DB H24春 午前II 問15 |
READ COMMITTEDで発生する異常の組合せを選ぶ問題。 | ・「ダーティリードは防止、ノンリピータブルリードとファントムリードは発生」が正解 ・4つの分離レベルと3つの異常の対応表を正確に覚えていないと解けない |
📝 IPA試験での出題パターン
パターン1:「この事象は何か」
2つのトランザクションの処理順序が図示され、発生した事象名を4択から選ぶ形式。DB H29春 問17がこの典型。「行が増えた」→ファントムリード、「値が変わった」→ノンリピータブルリード、「未コミットデータを読んだ」→ダーティリードと瞬時に判別できれば正答できる。
パターン2:「この分離レベルで何が起きるか」
特定の分離レベルを提示し、発生する異常の組合せを選ばせる形式。DB H24春 問15が該当する。前述の4×3の対応表を丸暗記していれば確実に得点できる。
AP午前での出題頻度は高くないので、深追いは不要です。「行の増減=ファントムリード」「REPEATABLE READまでは防げない」の2点を押さえれば試験ではここまででOKです。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. トランザクションの隔離性水準をREPEATABLE READに設定した場合に発生し得る異常として、正しいものはどれでしょうか?
- A. コミット前の未確定データを他のトランザクションが読み取ってしまう。
- B. 同じ検索条件で2回読み込みを行ったとき、1回目には存在しなかった行が2回目に出現する。
- C. 同じ行を2回読み込んだとき、別トランザクションのUPDATEにより値が変わっている。
正解と解説を見る
正解:B
解説:
REPEATABLE READは、ダーティリードとノンリピータブルリードを防止するが、ファントムリード(行の増減)は防止できない分離レベルです。したがって、同じ検索条件で行数が変わるBの現象が発生し得ます。
選択肢Aはダーティリードの説明です。ダーティリードはREAD COMMITTED以上の分離レベルで防止されるため、REPEATABLE READでは発生しません。選択肢Cはノンリピータブルリードの説明です。REPEATABLE READでは同じ行の値は保護されるため、この異常も発生しません。
よくある質問(FAQ)
Q. MySQLのデフォルト分離レベルはREPEATABLE READですが、ファントムリードは起きますか?
MySQL(InnoDB)はREPEATABLE READをデフォルトとしていますが、MVCC(Multi-Version Concurrency Control)とネクストキーロックという独自の仕組みによって、通常のSELECTではファントムリードが発生しない実装になっています。ただし、これはANSI SQL標準の定義よりも厳格な独自仕様です。IPA試験ではANSI標準に基づいた出題がされるため、「REPEATABLE READではファントムリードが発生する」と覚えておいてください。
Q. ファントムリードはDELETEでも起きますか?
起きます。INSERTで行が増えるケースが教科書的な典型例ですが、別トランザクションがDELETEをコミットして行数が減るケースもファントムリードに該当します。「前回の検索結果と行数が異なる」という点が本質であり、増減の方向は問いません。
Q. 実務でファントムリードが問題になる場面はどこですか?
在庫集計や売上レポートなど、「範囲検索の件数に基づいて計算を行う処理」で問題になります。例えば、月次の売上合計を算出するトランザクション中に、別の処理が新しい売上レコードを追加すると、合計金額と件数の整合性が崩れます。この種の処理ではSERIALIZABLEを指定するか、アプリケーション側で整合性チェックを入れるのが一般的な対処法です。
Q. 「アンリピータブルリード」と「ノンリピータブルリード」は別の用語ですか?
同じ異常を指す別名です。IPA試験ではどちらの表記も使われます。DB H29春 問17の選択肢では「アンリピータブルリード」、DB H24春 問15の解説では「ノンリピータブルリード」と記載されています。「ファジーリード」もまた同義語です。どの表記が出ても対応できるように、3つの呼び方をセットで覚えておくと安心です。