【とらんざくしょんぶんりれべる】

トランザクション分離レベル とは?

最終更新:
💡 同時実行する処理の間で、どこまで変更を見せるかを決める

複数のトランザクションを同時に実行するとき、他の処理の変更をどこまで見せ、どのような結果の不整合を防ぐかを定める設定。保証や実装はDB製品によって異なり、強い分離ほど必ず遅いとは限らない。

📌 このページのポイント
SQL標準で防ぐ異常の範囲○:防ぐ △:発生を許容レベル未確定値を読む再読の値が変わる検索集合が変わる直列化と不一致RU△△△△RC○△△△RR○○△△SER○○○○RU / RC / RR / SER は4レベルの略称実際のDBは、標準より強い保証もある例:PostgreSQLのRRはファントムも防ぐ
RU=READ UNCOMMITTED、RC=READ COMMITTED、RR=REPEATABLE READ、SER=SERIALIZABLE。SQL標準の防止範囲を簡略化した比較で、△は必ず発生するという意味ではありません。PostgreSQLのRRでは他のトランザクションによるファントムリードも防ぎます。
ひよこ ひよこ
分離レベルって何を決めるの?
ペンギン先生 ペンギン先生
他のトランザクションの変更をどこまで読めるか、同時実行でどんな不整合を防ぐかを決めるよ。必要な保証と、待ち時間や再試行などの負担を考えて選ぶ。高いほど全ての処理が必ず遅くなるという単純な関係ではないんだ
ひよこ ひよこ
どんな問題を防ぐの?
ペンギン先生 ペンギン先生
ダーティリードは他の処理の未コミットの値を読むこと。反復不能読取は、同じ行を読み直すと他の処理のコミットで値が変わること。ファントムは同じ条件で再検索した行の集合が変わることだよ。直列実行との不整合(serialization anomaly)は、完了した処理の結果が、どの順番で一件ずつ実行しても得られない状態をいうんだ
ひよこ ひよこ
4レベルは、どこまで防ぐ?
ペンギン先生 ペンギン先生
SQL標準ではREAD COMMITTEDでダーティリードを防ぎ、REPEATABLE READは反復不能読取も防ぐ。SERIALIZABLEは直列実行との不整合(serialization anomaly)も含めて防ぐよ。ただし製品の保証は標準より強い場合がある。PostgreSQLではREAD UNCOMMITTEDもREAD COMMITTEDとして動き、REPEATABLE READでもファントムを防ぐんだ
ひよこ ひよこ
SERIALIZABLEは一件ずつ実行するの?
ペンギン先生 ペンギン先生
同時に実行しても、成功してコミットした処理が、ある順番で一件ずつ実行した場合と同じ結果になるという意味だよ。PostgreSQLは矛盾につながる競合を監視し、必要なら処理を失敗させる。並列実行そのものを禁止するわけではなく、アプリ側でトランザクション全体の再試行が必要になることがあるんだ
ひよこ ひよこ
既定の設定は、どのDBでも同じ?
ペンギン先生 ペンギン先生
違うよ。参照したMySQL 8.4のInnoDBではREPEATABLE READ、PostgreSQL 18ではREAD COMMITTEDが既定の設定。管理者やセッションが変更している場合もある。使うDBの実際の設定と、読み取り・更新の仕様を確認して選ぼう
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「トランザクション分離レベル」って出てきたら「同時実行する処理の干渉を、どこまで防ぐかの設定」と思えばだいたいOK!
📖 おまけ:英語の意味
「Transaction Isolation Level」 = トランザクションを分離する度合い
💬 IsolationはACIDのIで、「分離」を意味するよ。設定名だけで実際のロックや読み取りの動きを決めつけず、使うDBの説明を確認しよう

参考資料

← 用語集にもどる