はじめに
DBのトランザクションレベルを学びたい!そこで、まずはダーティリードを理解していきます!!
1. ダーティリードとは何か?
一言でいうと、「他人が作業中の、まだ確定(コミット)していない”中途半端なデータ”を読み取ってしまう現象」のことです。
データベースには、処理を確定させる「コミット」と、処理を取り消す「ロールバック」という機能があります。ダーティリードを許容する設定(READ UNCOMMITTEDなど)にしていると、他のプロセスが「後で取り消すかもしれない未確定のデータ」を覗き見できてしまいます。
2. シーケンス図で見る:銀行口座で起きる悲劇
あなたの口座残高が「10万円」だとします。
ここで、「A:入金システム」と「B:残高確認アプリ」が同時に動いた場合のタイムラインをシーケンス図で見てみましょう。
3. 何が危険なのか?
上記のシーケンス図で、Bのアプリがステップ4で読み取った「15万円」というデータ。
これはAが作業中だったため一時的に存在しただけで、ステップ6で取り消されたため、現実には一度も確定しなかった「幻のデータ」です。
もしBのアプリが「15万円ある」という前提で別の引き落とし処理などを進めてしまったらどうなるでしょうか?
実際の残高は10万円しかないため、システム全体で致命的なデータの矛盾やバグが発生してしまいます。これがダーティリードの最大の恐ろしさです。
4. まとめ:PostgreSQLがダーティリードを許さない理由
ダーティリードは、「データの正確性」よりも「とにかく他の処理を待たせずにスピードを最優先する」という極端な設定をした場合にのみ発生します。
しかし、上記のような致命的なデータ破壊を招くリスクが高すぎるため、PostgreSQLでは一番ゆるいレベルに設定しても、内部で自動的にダーティリードを防ぐ設定(READ COMMITTED)に引き上げられます。
「未確定のデータは、絶対に他人に見せない」
これがデータベースにおける安全確保の第一歩であり、ダーティリードを理解する最大の意義なのです。