トランザクション分離レベル SQL 92版
トランザクション分離レベルとは?
- 複数のトランザクションで同じデータにアクセスした際のトランザクション間の影響度合い
- 分離レベル毎に発生する不整合の種類が異なる
- 発生する不整合に応じてトランザクション分離レベルが定義される
- 分離レベルが高いほど発生する不整合の種類が減りるが、スケーラビリティが落ちる
- 基本的な不整合の種類についてはANSI SQL 92にて定義されている
トランザクション分離レベルを定義する問題
トランザクション分離レベルはレベル毎に発生する不整合の種類が異なる。 以下で発生する不整合について簡単に記載する。
Dirty Read
あるトランザクション(T1)がcommit or rollbackする前のデータを別のトランザクション(T2)が読んでしまう問題
Non-repeatable or Fuzzy Read
あるトランザクション(T1)がデータXを読み込んだ後、別のトランザクション(T2)がデータXを書き換えcommitし、 T1のトランザクションが変更された後のデータXを読み込んでしまう問題
Phantom
あるトランザクション(T1)が特定条件を満たすデータの集合(S1)を読み込んだ後に、 別のトランザクション(T2)がS1を満たすデータを作成しcommitする。 T1のトランザクションが再度S1のデータ集合を読み込むと、最初の読み込みとは異なるデータ集合を得てしまうこと
トランザクション分離レベル
- トランザクションの並列実行時に発生する可能性がある問題に応じてトランザクション分離レベルが定義される
レベル | Dirty Read | Non-repeatable or Fuzzy Read | Phantom |
---|---|---|---|
READ UNCOMMITTED | x | x | x |
READ COMMITTED | o | x | x |
REPEATABLE READ | o | o | x |
SERIALIZABLE | o | o | o |
o: 発生しない x: 発生する
その他
ANSI SQL 92で定義されている不整合意外や分離レベル以外もあるので、 詳細を知りたければ下記を読むといいと思う(後でまたまとめる)。 https://arxiv.org/pdf/cs/0701157.pdf
参考資料
A Critique of ANSI SQL Isolation Levels