【りーどこみってど】

Read Committed とは?

💡 確定したものだけ見せてね!下書きはお断り
📌 このページのポイント
トランザクション分離レベルの比較 分離レベル ダーティリード ノンリピータブル ファントム Read Uncommitted ✗ 発生 ✗ 発生 ✗ 発生 Read Committed ✓ 防止 ✗ 発生 ✗ 発生 Repeatable Read ✓ 防止 ✓ 防止 ✗ 発生 Serializable ✓ 防止 ✓ 防止 ✓ 防止 ◆ PostgreSQL / Oracle デフォルト: Read Committed ◆ MySQL(InnoDB) デフォルト: Repeatable Read ↑ 安全性が低い           ↓ 安全性が高い(パフォーマンスは低下)
トランザクション分離レベルの比較
ひよこ ひよこ

Read Committedって、何を読めるの?

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

「コミット済み(確定済み)」のデータだけを読み取れる、というトランザクション分離レベルだよ。他のトランザクションがまだ処理中の未確定データは見えないようにするんだ

ひよこ ひよこ

それってつまりダーティリードが防げるってことだよね?

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

そう!ダーティリードは防げるよ。でも、他のトランザクションがコミットした変更は見えちゃうから、同じクエリを2回実行すると値が変わるノンリピータブルリードは起きうるんだ

ひよこ ひよこ

どのデータベースで使われてるの?

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

PostgreSQLOracle Databaseのデフォルト分離レベルがRead Committedだよ。一方、MySQLのInnoDBはRepeatable Readがデフォルトなんだ

ひよこ ひよこ

じゃあPostgreSQLの方が安全性が低いの?

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

一概にそうとは言えないよ。Read Committedはロックが少ないからパフォーマンスが良く、多くの業務アプリでは十分な安全性なんだ。必要に応じて分離レベルを上げればいいだけだしね

ひよこ ひよこ

分離レベルって全部でいくつあるの?

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

SQL標準では4つ定義されているよ。Read Uncommitted、Read Committed、Repeatable Read、Serializableの順に安全性が上がるけど、その分パフォーマンスは下がる。実務では「デフォルトのまま使って、問題が出たら上げる」というアプローチが多いんだよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Read Committed」って出てきたら「確定済みデータだけ読む安全設定」と思えればだいたいOK!
📖 おまけ:英語の意味
「Read Committed」 = コミット済み読み取り
💬 committed(確定済み)のデータだけをread(読む)できるという意味だよ
← 用語集にもどる