【とらんざくしょんぶんりれべる】
トランザクション分離レベル とは?
最終更新:
💡 同時実行する処理の間で、どこまで変更を見せるかを決める
複数のトランザクションを同時に実行するとき、他の処理の変更をどこまで見せ、どのような結果の不整合を防ぐかを定める設定。保証や実装はDB製品によって異なり、強い分離ほど必ず遅いとは限らない。
📌 このページのポイント
分離レベルって何を決めるの?
他のトランザクションの変更をどこまで読めるか、同時実行でどんな不整合を防ぐかを決めるよ。必要な保証と、待ち時間や再試行などの負担を考えて選ぶ。高いほど全ての処理が必ず遅くなるという単純な関係ではないんだ
どんな問題を防ぐの?
ダーティリードは他の処理の未コミットの値を読むこと。反復不能読取は、同じ行を読み直すと他の処理のコミットで値が変わること。ファントムは同じ条件で再検索した行の集合が変わることだよ。直列実行との不整合(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の説明を確認しよう