【りーどこみってど】

Read Committed とは?

最終更新:
💡 他の処理の未確定変更を読み取らない

他のトランザクションの未コミット変更を読み取らない分離レベル。ダーティリードを防ぐ一方、再読み取りの変化や行の増減は起こり得ます。PostgreSQLの例と実装の違いを解説します。

📌 このページのポイント
Read Committed:再び読むと変わり得るPostgreSQLの通常SELECTの例:初期値100同じトランザクションAトランザクションB1回目のSELECT100を読む200へ更新未コミットAからは読めない同じ処理を継続COMMIT200が確定2回目のSELECT200を読む確定済み200上から下へ時間が進む。Aは同じ処理未確定変更を読まない ≠ 結果を固定する
Bのコミットを挟む二つのSELECTは、同じA内でも異なる値を読めます。自分の更新は別に見え、ロックやスナップショットの動作は製品・設定で確認します。
ひよこ ひよこ
Read Committedは、何を読まない設定?
ペンギン先生 ペンギン先生
他のトランザクションが変更した、まだコミットされていないデータを読まない分離レベルだよ。後で取り消されるかもしれない変更を読む、ダーティリードを防ぐんだ。
ひよこ ひよこ
自分が変更したものも、コミットするまで見えない?
ペンギン先生 ペンギン先生
自分のトランザクション内の変更とは区別しよう。PostgreSQLでは、同じトランザクションで行った先の更新を、コミット前でもSELECTで確認できるよ。
ひよこ ひよこ
同じトランザクションなら、何回読んでも同じ値?
ペンギン先生 ペンギン先生
そうとは限らないよ。PostgreSQLの通常のSELECTは、文の開始時点のスナップショットを見る。二つのSELECTの間に他のトランザクションがコミットすると、二回目は変更後の値を読むことがあるんだ。
ひよこ ひよこ
行が増えたり減ったりすることもある?
ペンギン先生 ペンギン先生
条件に合う行の集合が変わるファントムリードも起こり得るよ。読み取った値が変わるノンリピータブルリードも含め、ダーティリードを防ぐことだけですべての競合を防げるわけではないんだ。
ひよこ ひよこ
ロックが少なくて、いつでも速い?
ペンギン先生 ペンギン先生
実装や設定、処理の内容によるよ。SQL ServerではRead Committedでも、共有ロックを使う設定と行の版を使う設定がある。更新の競合では待つこともあるので、名前だけで性能を決めないようにしよう。
もっと詳しく知りたい人へ

分離レベルを上げれば、業務の誤りはすべてなくなる?

業務ルールの制約や更新方法、トランザクションの範囲も設計します。たとえば読んだ残高をもとに後で更新する処理では、競合をどう防ぐかが必要です。分離レベルだけを変えて、入力検証や制約まで不要になるわけではありません。

SQL標準の表が、そのまま全製品の挙動?

製品は標準より強い保証を提供することもあります。PostgreSQLではRead UncommittedはRead Committedと同じ動作で、Repeatable Readもファントムリードを防ぎます。使う製品と設定の資料を確認し、単純な速度や安全性の順位だけで選ばないようにします。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Read Committed」って出てきたら「ほかのトランザクションの未確定な変更を読まない分離レベル」と思えばだいたいOK!同じ問い合わせが、毎回同じ結果になる保証ではないよ。
📖 おまけ:英語の意味
「Read Committed」 = コミット済みのデータを読む
💬 トランザクション分離レベルの名前です。他のトランザクションの変更をどこまで見せるかを扱います。「安全性」の一言で、業務上の正しさや性能まで決まるものではありません。

参考資料

← 用語集にもどる