本文へスキップ

ファントムリードとは?

ふぁんとむりーど

ファントムリードとは、データベースのトランザクション処理において、同一トランザクション内で同じ条件の問い合わせを繰り返した際に、途中で別のトランザクションの挿入・削除により結果行が増減する現象です。

ファントムリード(Phantom Read)は、データベーストランザクション処理における並行性問題のひとつです。同一トランザクション内で同じ条件(WHERE句)を持つSELECT文を2回実行した場合に、2回目の実行結果が1回目と異なる行数を返す現象を指します。この「幽霊(ファントム)」のように出現したり消えたりする行が名称の由来です。

具体的な発生シナリオは次の通りです。トランザクションAが「年齢30歳以上」の顧客を検索したとします。その後、トランザクションBが新たに30歳の顧客を追加してコミットします。トランザクションAが再び同じ条件で検索すると、今度は新しい行が結果に含まれます。この増減した行が「ファントム(幽霊行)」です。

ファントムリードはトランザクション分離レベルと密接な関係があります。

  • READ UNCOMMITTED:ダーティリード・ノンリピータブルリード・ファントムリードすべてが発生しうる
  • READ COMMITTED:ダーティリードは防げるが、ノンリピータブルリードとファントムリードは防げない
  • REPEATABLE READ:ノンリピータブルリードは防げるが、ファントムリードは防げない場合がある
  • SERIALIZABLE:ファントムリードを含むすべての並行性問題を防ぐ最高分離レベル

ファントムリードを防ぐには、SERIALIZABLE分離レベルを使用するか、範囲ロック(ギャップロック)を利用します。ただし、分離レベルが高いほど同時実行性が下がるため、性能と整合性のトレードオフを考慮した設計が必要です。

使い方・例文

在庫管理システムで「残り在庫5個以上」を条件に検索を繰り返す処理中に、別トランザクションが在庫を追加すると、ファントムリードにより検索結果が変わることがあります。

この用語をシェア

𝕏 でポスト LINE

最終更新:

関連用語