【だーてぃりーど】

ダーティリード とは?

最終更新:
💡 まだ下書きなのに読んじゃった!取り消されたらどうするの?

まだ確定(コミット)されていない他のトランザクションの変更データを読み取ってしまう現象。データの整合性を損なう危険な読み取りの一つ。

📌 このページのポイント
ダーティリード:別の処理の未確定データを読む ① → ② → ③ の順に進む例 ① A:更新 ② B:読み取り ③ A:取消 10 → 20万円 まだ未確定 20万円を読む ダーティリード 10万円に戻る ロールバック 未確定の変更を使うと、後で取り消される恐れ Read Uncommittedで許される現象(実装による)
残高は架空例。BがAの未コミットの変更を読み、Aが後で取り消す。PostgreSQLではRead Uncommittedを指定しても、この現象は起きない。
ひよこ ひよこ
ダーティリードって、汚れたデータを読むこと?
ペンギン先生 ペンギン先生
ここでのdirtyは未確定の変更という意味だよ。別のトランザクションが書いた、まだコミットしていないデータを読むことなんだ。例えば、口座の残高を変更したけれど、確定前の値を別の処理が見てしまう場合だね。
ひよこ ひよこ
変更後の値なら正しくないの?
ペンギン先生 ペンギン先生
その変更が後でロールバックされるかもしれないよ。仮に残高を10万円から20万円へ変更して、別の処理が20万円を読む。その後、変更を取り消せば、読んだ値を根拠に進めた処理に問題が出るんだ。
ひよこ ひよこ
どうすれば防げるの?
ペンギン先生 ペンギン先生
SQL標準ではRead Committed以上の分離レベルで防ぐよ。ただし、どの変更が読めるかは使う製品の仕様も確認しよう。自分のトランザクション内の未確定の変更を自分で読むことは、ダーティリードとは違うんだ。
ひよこ ひよこ
Read Uncommittedなら必ず起きる?
ペンギン先生 ペンギン先生
必ずではないよ。標準では許されるけれど、PostgreSQLではRead Uncommittedを指定してもRead Committedとして動き、ダーティリードは起きない。分離レベルの名前と、製品が提供する保証を分けて考えよう。
ひよこ ひよこ
分離レベルを上げると、必ずロックが増える?
ペンギン先生 ペンギン先生
仕組みによるよ。PostgreSQLは複数の版を使うスナップショットで読み取りを扱い、分離レベルによっては競合時の再試行も必要になる。性能への影響をロックだけで決めつけず、必要な整合性と処理の負荷を確認するんだ。
もっと詳しく知りたい人へ

ダーティリードを防げば、読み取りの問題は全部なくなる?

なくならない。Read Committedでは、別の処理がコミットした結果、同じ行を読み直すと値が変わる非反復読み取りや、同じ条件の検索結果が変わるファントムリードが起こり得る。未確定の変更を読むダーティリードとは別の現象だ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ダーティリード」って出てきたら「別のトランザクションの、まだ確定していない変更を読むこと」と思えばだいたいOK!
📖 おまけ:英語の意味
「Dirty Read」 = 汚い読み取り
💬 「dirty(汚い)」は未確定で信頼できないデータという意味。まだ正式に確定してないから「汚れた」データなんだよ

参考資料

← 用語集にもどる