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

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

公開:
💡 さっき読んだ値が変わってる!もう一度読んでも同じとは限らない
📌 このページのポイント
ノンリピータブルリード(値が変わる問題) トランザクション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(否定)がついて、「もう一度読んでも同じ結果にならない」という意味だよ
← 用語集にもどる