【のんりぴーたぶるりーど】
ノンリピータブルリード とは?
最終更新:
💡 さっき読んだ値が変わってる!もう一度読んでも同じとは限らない
同じトランザクションで同じ行を読み直したとき、別のトランザクションが変更をコミットしたため、値が変わったり行がなくなったりする現象。ファジーリードとも呼ばれる。
📌 このページのポイント
ノンリピータブルリードって、何が繰り返せないの?
Read Committedでも起きるの?
起きることがあるよ。たとえばPostgreSQLのRead Committedでは、文ごとに、その文の開始時点でコミット済みのデータを読む。2つのSELECTの間に別の取引がコミットすると、結果が変わりうるんだ。
ダーティリードとは何が違うの?
防ぐにはどうすればいいの?
SQL標準ではRepeatable Read以上で防ぐよ。PostgreSQLのRepeatable Readは、最初のトランザクション制御以外の文の開始時点のスナップショットを使う。後から他の取引がコミットした変更は見えないけれど、自分の更新は見える。DBによって、ロックなど実現の仕組みは異なるんだ。
ファントムリードは、行の数が変わること?
まとめ:ざっくりこれだけ覚えればOK!
「ノンリピータブルリード」って出てきたら「同じ取引中に行を読み直したら、他の取引の変更で結果が変わった現象」と思えばだいたいOK!
📖 おまけ:英語の意味
「Non-Repeatable Read」 = 繰り返し不可能な読み取り
💬 repeatable(繰り返し可能)にnon(否定)がついて、「もう一度読んでも同じ結果にならない」という意味だよ