イメージ掴みたい方用
トランザクションの分離レベルとは
- トランザクションに指定できる直列化の度合い。
- 直列化とは、並列化の反対で、トランザクションを順番に実行するようにすること。
- 直列化の度合いとは、複数トランザクションを実行したときの結果が、どれだけ「順番に実行した結果」に近くなるか、ということ。
- 最高は順番に実行したとき。
- 分離レベル高:整合性↗、処理効率↘(順次実行に近いと整合性は担保できるが遅い)
- 最低はまだコミット前のデータでも読んでしまう(別トランザクションの結果を確定前でも先読みしてしまう)ようなとき。
- 分離レベル低:処理性能↗、整合性↘(並列化すると処理速度は上がるが複数の処理が混じってデータが整合しないことあり)
- 最高は順番に実行したとき。
- SQLで"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;" みたいにして使う(MySQLの例)
各分離レベル
低い順。
異常形態の名前の解釈は個人のものです。あくまでイメージを掴むため...
(ただし、固有名詞は参考書やドキュメントに記載のあるもの)
READ UNCOMITTED
他のトランザクションが更新した、コミット前のデータも読む。
実際にはコミットされずロールバックされた場合には、コミット前のデータはダーティデータとなり、上記読み取りはダーティリードと呼ぶ。
READ COMITTED
他のトランザクションでコミット済みのデータを読む(コミット待ちの変更は読まない)。
ただし、コミットさえされれば読むため、
トランザクション中で同じデータを2回以上読んでいる場合は、1回目と2回目とで読み取り結果が異なる、があり得る。
これは、再度読んでも同じ結果が返らない(繰り返しが効かない)、という意味でノンリピータブルリードと呼ぶ。
REPEATBLE READ
トランザクション内であれば、同じデータを何度読みだしても、(他のトランザクションがそのデータを更新してコミットしようが)必ず同じ結果を返す。
ただし、対象データの更新や削除を無視するだけで、処理途中に新規追加された行がぽんと現れることはある。
これは、1回目などには存在しなかった行が現れるという意味で、ファントムリードと呼ぶ。
SERIARIZABLE
順番に実行する。
並列実行しても制御されて直列実行される。
分離レベルと各異常形態の関係
ある分離レベルで起こりうる異常は、それ以下の分離レベルでも起こりうる。
| 分離レベル\異常形態 | ダーティリード | ノンリピータブルリード | ファントムリード |
|---|---|---|---|
| READ UNCOMITTED | 許す | 許す | 許す |
| READ COMITTED | 許さない | 許す | 許す |
| REPEATABLE READ | 許さない | 許さない | 許す |
| SERIALIZABLE | 許さない | 許さない | 許さない |
参考
-
データベーススペシャリストドットコム
平成31年春期 午前Ⅱ 問9
ひとこと
多くのDB製品はデフォルトはREAD COMITTEDらしい。実際は排他制御とかも使っていい感じにやってるらしい。
間違いやこの方が覚えやすいよ等あればコメントやご指摘いただけますと嬉しいです!