【のんりぴーたぶるりーど】
ノンリピータブルリード とは?
💡 さっき読んだ値が変わってる!もう一度読んでも同じとは限らない
📌 このページのポイント
ノンリピータブルリードって名前が長いね!何が繰り返せないの?
同じデータの読み取りが繰り返せない、つまり同じ行を2回読んだのに値が変わっちゃう現象だよ。たとえば商品の在庫数を確認して「100個ある」と読んだのに、もう一度読んだら「50個」になってた、みたいなことだね
それって誰かが間に更新したってことだよね?
その通り!別のトランザクションがUPDATEしてコミットしたデータを、自分のトランザクション内で読んじゃうんだ。Read Committed分離レベルで起きる問題だよ
ダーティリードとどう違うのかな?
防ぐにはどうすればいいの?
Repeatable Read分離レベルに設定すれば防げるよ。トランザクション開始時点のスナップショットを使って、他のトランザクションの変更が見えないようにするんだ。PostgreSQLではMVCCという仕組みでこれを実現してるよ
ファントムリードとも似てる気がするけど…
まとめ:ざっくりこれだけ覚えればOK!
「ノンリピータブルリード」って出てきたら「同じ行を読み直したら値が変わってた問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Non-Repeatable Read」 = 繰り返し不可能な読み取り
💬 repeatable(繰り返し可能)にnon(否定)がついて、「もう一度読んでも同じ結果にならない」という意味だよ