【のんりぴーたぶるりーど】

ノンリピータブルリード とは?

💡 さっき読んだ値が変わってる!もう一度読んでも同じとは限らない
📌 このページのポイント
ノンリピータブルリード(値が変わる問題) トランザクションA SELECT 残高 → 100万円 SELECT 残高 → 50万円!? トランザクションB UPDATE + COMMIT 1回目: 100万円 正しい値 2回目: 50万円 値が変わった!
ノンリピータブルリードのイメージ
ひよこ ひよこ

ノンリピータブルリードって名前が長いね!何が繰り返せないの?

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

同じデータの読み取りが繰り返せない、つまり同じ行を2回読んだのに値が変わっちゃう現象だよ。たとえば商品の在庫数を確認して「100個ある」と読んだのに、もう一度読んだら「50個」になってた、みたいなことだね

ひよこ ひよこ

それって誰かが間に更新したってことだよね?

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

その通り!別のトランザクションがUPDATEしてコミットしたデータを、自分のトランザクション内で読んじゃうんだ。Read Committed分離レベルで起きる問題だよ

ひよこ ひよこ

ダーティリードとどう違うのかな?

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

ダーティリードは未コミットのデータを読む問題で、ノンリピータブルリードはコミット済みのデータが変わる問題だよ。どちらも困るけど、ダーティリードの方がより危険だね

ひよこ ひよこ

防ぐにはどうすればいいの?

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

Repeatable Read分離レベルに設定すれば防げるよ。トランザクション開始時点のスナップショットを使って、他のトランザクションの変更が見えないようにするんだ。PostgreSQLではMVCCという仕組みでこれを実現してるよ

ひよこ ひよこ

ファントムリードとも似てる気がするけど…

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

いい質問だね。ノンリピータブルリードは「既存の行の値が変わる」問題で、ファントムリードは「行の数が変わる」問題だよ。UPDATEで起きるのがノンリピータブルリード、INSERT/DELETEで起きるのがファントムリードと覚えるとわかりやすいね

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ノンリピータブルリード」って出てきたら「同じ行を読み直したら値が変わってた問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Non-Repeatable Read」 = 繰り返し不可能な読み取り
💬 repeatable(繰り返し可能)にnon(否定)がついて、「もう一度読んでも同じ結果にならない」という意味だよ
← 用語集にもどる