【だーてぃりーど】
ダーティリード とは?
💡 まだ下書きなのに読んじゃった!取り消されたらどうするの?
📌 このページのポイント
- コミット前の未確定データを別トランザクションが読み取ってしまう現象
- 読み取った後にロールバックされると、存在しないデータを基に処理してしまう
- Read Uncommitted分離レベルで発生し、Read Committed以上で防止できる
- 金融系など整合性が重要なシステムでは絶対に避けるべき問題
ダーティリードって、なんだか汚いイメージの名前だね!
「まだ確定してないデータ」を読んじゃうことだよ。たとえば、Aさんが銀行口座に10万円振り込む処理をしてる最中に、Bさんがその口座残高を見ちゃうようなものだね
それの何が問題なの?10万円増えてるなら正しいんじゃないかな?
問題は、Aさんの振り込みがエラーで取り消し(ロールバック)されることがある点だよ。Bさんは「10万円増えた残高」を見て処理を進めたのに、実際には増えてなかった…ということが起きるんだ
えっ、それは大変だね!どうやって防ぐの?
トランザクション分離レベルをRead Committed以上に設定すれば防げるよ。コミット済みのデータだけ読むようにするんだ
分離レベルを上げればいいんだね!でも、なんで最初から全部防がないのかな?
分離レベルを上げるとロックが増えてパフォーマンスが落ちるからだよ。速度と安全性のトレードオフなんだ。多くのデータベースではデフォルトでRead Committedになっていて、ダーティリードは起きないようになってるけどね
じゃあ実際にダーティリードが起きることってあるの?
まとめ:ざっくりこれだけ覚えればOK!
「ダーティリード」って出てきたら「まだ確定してない他人の書きかけデータを読んじゃう問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dirty Read」 = 汚い読み取り
💬 「dirty(汚い)」は未確定で信頼できないデータという意味。まだ正式に確定してないから「汚れた」データなんだよ