データベーススペシャリストを勉強していて初めて見た単語だったので整理がてら。
「隔離性水準」とは、複数のトランザクションを同時実行するときの、ACID特性のIsolation(独立性、隔離性)について許容レベルを定めたもの
ACID特性(特にIsolation)
データベースのトランザクション処理で必要とされる4つの要素について、頭文字をとって表したもの。
- Atomicity(原子性)
- Consistency(一貫性)
- Isolation(独立性、隔離性)
- Durability(永続性)
Isolationの特性は以下。
- 複数のトランザクションを同時実行した結果と、1つずつ順番に(直列に)実行した結果が同じになる
- 複数のトランザクションを同時実行時、実行中のトランザクションAは、他のトランザクションBの実行結果に影響されない
- ∟Aは同時実行開始前のデータを見る
⇒ トランザクションを同時実行するにしても、分離された状態で操作を行う必要がある
Isolationを満たさない事象
しかし、同時実行(並列実行)したとき、Isolationを満たさない事象が主に3つ発生する。
ここからは、トランザクションA=実行中のトランザクション、 トランザクションB=別のトランザクション とおく。
1. Dirty Read / ダーティリード
トランザクションAでコミットされていないデータを、トランザクションBが読み取ってしまう。
2. Fuzzy Read / ファジーリード
Non-Repeatable Read / ノンリピータブルリード(非再現リード)
トランザクションAでデータを読み取っている途中で、トランザクションBでデータを更新してコミットした場合、トランザクションAで再度読み取ると、期待とは違う結果のデータを読み取ってしまう。
3. Phantom Read / ファントムリード
トランザクションAで複数行に対して処理を行っている途中で、トランザクションBで行の挿入・削除をコミットした場合、トランザクションAの処理の条件に合う行が挿入されたり、処理中の行が削除されたりしてしまう。
(幻影のようにデータが反映されてしまう)
隔離性水準
これらの現象をどこまで許容するかを分離レベルで表したものが「隔離性水準」。
4種類ある。
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable(直列化可能性) ←Isolationの特性の1つである、「同時実行と1つずつ実行の結果が同じ」
1, 2, 3, 4の順で分離レベルが高くなり、以下の2つの効果がある。
- トランザクションの影響を受けづらい。 ⇒ 不整合なデータを読み込むトランザクション数が減る
- 処理負担が大きくなり、実行スピードが遅くなる。 ⇒ 単位時間内に処理できるトランザクション数が減る
①と②から、分離レベルと実行スピードはトレードオフの関係と言える。
以下に現象と分離レベルの関係、また現象ごとの対策をまとめた表を載せておく。
○=(現象が)発生する ×=発生しない
現象 分離レベル | Dirty Read | Fuzzy Read Non-Repeatable Read | Phantom Read |
---|---|---|---|
Read Uncommitted | ○ | ○ | ○ |
Read Committed | × | ○ | ○ |
Repeatable Read | × | × | ○ |
Serializable | × | × | × |
対策 | データ更新時に「専有ロック」をかける | データを読み込むときに「共有ロック」をかける | 処理範囲に専有ロックをかける |
このページの最後
ロック関係はまとめるかもしれないし、まとめないかもしれない。
更新もちょくちょくするかもしれない。間違ったものは修正していくスタイルで。
…記事書くの、大変(´・ω・`)