情報処理試験を勉強していると、「ファントムリードやノンリピータブルリードと何が違うの?」と混乱しがちです。

この記事では、ダーティリードの意味をたとえ話で噛み砕き、試験で問われるポイントまで一気に整理します。

対象試験と出題頻度

ダーティリードは、応用情報技術者試験で出題される可能性のあるテーマです。

トランザクションの排他制御や分離レベルの問題の中で登場し、ノンリピータブルリード・ファントムリードとの区別が問われます。

詳細をクリックして確認
対象試験:
応用情報技術者
出題頻度:
★☆☆☆☆
ランクD(発展)参考程度

ダーティリードの定義

ダーティリード(Dirty Read)とは、一言で言うと

 「他のトランザクションがまだコミットしていないデータを読み取ってしまう現象

のことです。

イメージとしては、下書き中の書類をうっかりコピーしてしまうことです。

同僚がまだ修正中の報告書を「完成版だ」と思ってコピーし、その後同僚が内容を全部書き直した。

あなたの手元にあるコピーは、もはや存在しない内容です。データベースの世界で起きるこの問題がダーティリードです。

📊 ダーティリードの基本情報

項目 内容
英語名 Dirty Read
分類 トランザクション処理における異常現象(データベース)
防止に必要な分離レベル READ COMMITTED 以上
関連する異常 ノンリピータブルリード、ファントムリード、ロストアップデート

解説

データベースでは、複数のトランザクションが同時に動くのが当たり前です。

ある処理がデータを書き換えている最中に、別の処理がそのデータを参照する場面は日常的に発生します。

ここで問題になるのが「書き換え途中のデータ(ダーティデータ)」の扱いです。

書き換え元のトランザクションがコミットすれば問題ありませんが、ロールバックされると、読み取り側は「そもそも存在しなかった値」を基に処理を進めたことになります。

発生の流れ

具体的にどのような順序で発生するのかを時系列で整理します。

⚠ ダーティリードの発生フロー

トランザクション T1

① 残高を 1000→500 に更新
 
③ ロールバック(残高は1000に戻る)

トランザクション T2

 
② 残高を読む → 500 を取得
④ 500 は幻のデータだった!

▲ T2が読んだ「500」はT1のロールバックで消えた値。これがダーティリード。

トランザクション分離レベルとの関係

SQL標準では、トランザクションの分離レベル(隔離性水準)を4段階で定義しており、どのレベルでどの異常が許容されるかが決まっています。

📊 分離レベルと読み取り異常の関係

分離レベル ダーティリード ノンリピータブルリード ファントムリード
READ UNCOMMITTED 発生する 発生する 発生する
READ COMMITTED 防止 発生する 発生する
REPEATABLE READ 防止 防止 発生する
SERIALIZABLE 防止 防止 防止

▲ 上から下へ分離レベルが高くなるほど安全だが、その分ロック範囲が広がり性能は低下する

ポイントは、READ UNCOMMITTED(未コミット読み取り)だけがダーティリードを許容するという点です。

多くのDBMSでは標準の分離レベルがREAD COMMITTEDに設定されているため、実務上ダーティリードが起きるケースは意図的に分離レベルを下げた場合に限られます。

3つの読み取り異常の比較

混同しやすい3つの異常を「何が起きるか」で比較します。

異常の名称 何が起きるか 見分けキーワード
ダーティリード コミット前のデータを読んでしまい、ロールバックされると存在しない値を得る 未コミット、ロールバック
ノンリピータブルリード 同じ行を2回読んだら、他のトランザクションの更新・削除により値が変わっていた 再読込、値の変化
ファントムリード 同じ条件で2回検索したら、他のトランザクションの挿入により前回なかった行が現れた 行の追加、検索条件

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 ダーティリードの核心を3行で

・コミット前のデータを他のトランザクションが読んでしまう現象
・READ UNCOMMITTED でのみ発生し、READ COMMITTED 以上で防止できる
・ノンリピータブルリード(値の変化)・ファントムリード(行の出現)とは発生メカニズムが異なる


試験ではこう出る!

ダーティリードは、応用情報技術者試験の午前問題で直接的に問われた実績は少なく、頻出度はD(参考程度)です。ただし、データベーススペシャリスト試験(DB)では繰り返し出題されており、AP午後のデータベース問題でも関連知識が求められることがあります。

📊 関連する過去問の出題実績

試験回 出題内容 問われたポイント
DB H26春
午前Ⅱ 問14
T2の振る舞いのうちダーティリードに該当する記述を選ぶ問題。 ・「T1が更新→T2が読む→T1がロールバック」が正解
・ファントムリード、ノンリピータブルリード、ロストアップデートの説明がひっかけ
DB H31春
午前Ⅱ 問9
「ダーティリードは回避できるが、ノンリピータブルリードは許容する」分離レベルを選ぶ問題。 ・正解はREAD COMMITTED
・分離レベルの表を正確に暗記しているかが鍵
AP R4春
午後 問6
クーポン発行サービスの排他制御とロック方式に関する問題。 ・「ロックを掛けずに参照」するとコミット前データを読む可能性がある文脈
・直接「ダーティリード」の語は出ないが、背景知識として必要

📝 IPA試験での出題パターン

パターン1:「記述から異常の種類を選べ」
4つのトランザクション異常(ダーティリード・ノンリピータブルリード・ファントムリード・ロストアップデート)の説明文が並び、該当するものを選ぶ形式。「コミット前」「ロールバック」が含まれる選択肢がダーティリードの目印です。

 

パターン2:「分離レベルと異常の対応を選べ」
「ダーティリードを防止でき、ノンリピータブルリードは許容する」等の条件から分離レベルを特定させる形式。前述の分離レベル対応表を覚えていれば即答できます。

 

AP受験者は分離レベルの表を丸暗記するよりも、「どの異常がどのレベルで初めて防止されるか」の境界線だけ押さえればOKです。深追いは不要です。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. データベースのトランザクション処理における「ダーティリード」の説明として、最も適切なものはどれでしょうか?

  • A. トランザクションT1が更新したコミット前のデータをトランザクションT2が読み取り、その後T1がロールバックされると、T2は存在しない値を読んだことになる。
  • B. トランザクションT2が同じ行を2回読み取った際に、その間に別のトランザクションT1が当該行を更新したため、読み取る度に値が変わってしまう。
  • C. トランザクションT2が同じ条件で2回検索した際に、その間に別のトランザクションT1が条件を満たす行を挿入したため、前回なかった行が出現する。

正解と解説を見る

正解:A

解説:
ダーティリードは、コミット前の中間データを他のトランザクションが読み取ってしまい、ロールバック後に「存在しない値を読んだ」状態になる異常です。DB H26春 午前Ⅱ 問14でも同様の記述が正解選択肢となっています。

選択肢Bはノンリピータブルリード(ファジーリード)の説明です。同じ行を複数回読んだときに値が変わる現象であり、コミット前のデータを読む問題とは異なります。選択肢Cはファントムリードの説明です。検索条件を満たす行が途中で増えてしまう現象であり、既存行の値に関する問題ではありません。


よくある質問(FAQ)

Q. ダーティリードの「ダーティ」とは何を指していますか?

「ダーティ(dirty)」は「汚れた・未確定の」という意味です。コミットもロールバックもされていない中間状態のデータを「ダーティデータ」と呼び、このデータを読み取る行為が「ダーティリード」と名付けられています。正確に言えば「確定していないデータの読み取り」です。

Q. 実務でダーティリードが発生することはありますか?

多くのRDBMS(PostgreSQL、Oracle、SQL Serverなど)では標準の分離レベルがREAD COMMITTEDであるため、通常の運用でダーティリードが起きることはありません。ただし、大量データの集計処理で性能を優先してREAD UNCOMMITTEDに明示的に変更するケースがあり、そのような場面では意図的にダーティリードを許容することがあります。

Q. ダーティリードとロストアップデートは何が違いますか?

ダーティリードは「読み取り」に関する異常で、コミット前の値を読んでしまう問題です。一方、ロストアップデート(更新消失)は「書き込み」に関する異常で、先に行われた更新が後のトランザクションの上書きによって失われる問題です。読む側の問題か書く側の問題か、という点で明確に区別できます。

Q. MySQLのデフォルト分離レベルではダーティリードは起きますか?

MySQLのInnODBストレージエンジンのデフォルト分離レベルはREPEATABLE READです。これはREAD COMMITTED より1段階上のレベルであるため、ダーティリードは発生しません。ノンリピータブルリードも防止されます。ただし、ファントムリードについてはMySQLの実装上ネクストキーロックによって多くのケースで防止されるものの、SQL標準上は発生し得るレベルとされています。