【だーてぃりーど】

ダーティリード とは?

💡 まだ下書きなのに読んじゃった!取り消されたらどうするの?
📌 このページのポイント
ダーティリード(未コミットデータの読み取り) 時間→ トランザクションA UPDATE 残高 ROLLBACK! トランザクションB SELECT 残高 未確定データ を読み取り! 不正なデータで処理
ダーティリードのイメージ
ひよこ ひよこ

ダーティリードって、なんだか汚いイメージの名前だね!

ペンギン先生 ペンギン先生

「まだ確定してないデータ」を読んじゃうことだよ。たとえば、Aさんが銀行口座に10万円振り込む処理をしてる最中に、Bさんがその口座残高を見ちゃうようなものだね

ひよこ ひよこ

それの何が問題なの?10万円増えてるなら正しいんじゃないかな?

ペンギン先生 ペンギン先生

問題は、Aさんの振り込みがエラーで取り消し(ロールバック)されることがある点だよ。Bさんは「10万円増えた残高」を見て処理を進めたのに、実際には増えてなかった…ということが起きるんだ

ひよこ ひよこ

えっ、それは大変だね!どうやって防ぐの?

ペンギン先生 ペンギン先生

トランザクション分離レベルRead Committed以上に設定すれば防げるよ。コミット済みのデータだけ読むようにするんだ

ひよこ ひよこ

分離レベルを上げればいいんだね!でも、なんで最初から全部防がないのかな?

ペンギン先生 ペンギン先生

分離レベルを上げるとロックが増えてパフォーマンスが落ちるからだよ。速度と安全性のトレードオフなんだ。多くのデータベースではデフォルトRead Committedになっていて、ダーティリードは起きないようになってるけどね

ひよこ ひよこ

じゃあ実際にダーティリードが起きることってあるの?

ペンギン先生 ペンギン先生

Read Uncommittedを明示的に設定した場合だけだね。速度を最優先にしたい集計処理などで使われることがあるけど、普通のアプリケーションではまず使わないよ。MySQLデフォルトはRepeatable Readだから、ダーティリードもファントムリードも防いでくれるんだ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ダーティリード」って出てきたら「まだ確定してない他人の書きかけデータを読んじゃう問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dirty Read」 = 汚い読み取り
💬 「dirty(汚い)」は未確定で信頼できないデータという意味。まだ正式に確定してないから「汚れた」データなんだよ
← 用語集にもどる