分離レベルはCSですね〜URですね~って業務で当たり前のように使っていますが、
なかなかRSとRRが名前が似てるので(と個人的には思ってます)どっちのモードがファントムリードが起きないんだっけ?ってなって確認するということを毎度毎度やってしまうのでその時のための備忘録的なつもりです。
#分離レベルとは
トランザクションの信頼性を保つために必要な特性としてACID属性というものがあります。
ACID属性は原子性(Atomicity)、一貫性(Consistency)、分離性(Isolation)、永続性(Durability)の4つの頭文字をとったもので、これらの属性のうち、今回は分離性(Isolation)に着目します。分離性は独立性ともいぅ場合もありますが今回は分離性ということにします。
分離性とは、1つのトランザクションは他のトランザクションの処理によって影響を受けないことです。
分離レベルによって、トランザクションが他のトランザクションからの影響を受ける範囲が異なります。
言い換えると、分離レベルによってアプリケーションからみて一度参照した照会結果がどの程度変更されることを許容するかということが変わってきます。
#他のトランザクションからの影響とは?
他のトランザクションによって起こりうる影響は3つあります。
###ダーティーリード(未コミット読み取り)
ダーティーリードとはあるトランザクションによって更新が行われている未コミット状態のデータが他のトランザクションから参照できてしまうことを言います。
###ノンリピータブルリード(反復不能読み取り)
ノンリピータブルリードとは一度読み込んだデータを他のトランザクションによって更新・削除されることによって、次に同様にデータを読み込もうとしても最初に読み込んだ時と同じ結果が返されないことを言います。
###ファントムリード(幻像読み取り)
ファントムリードとはあるトランザクション内で得られた結果が、他のトランザクションによりデータが挿入されることにより、次に同様にデータを読み込もうとしても最初に読み込んだ時と異なる結果が返されることを言います。
どのトランザクションにおいても、いずれの現象が一切発生しないことがデータの整合性の観点ではあるべき姿です。ただいずれの現象が一切発生しないようにデータアクセスの制御を行った場合、1つのトランザクションが更新している最中は他のトランザクションからのアクセスができず、アプリケーションがずっと待機してしまうなど、パフォーマンスに影響が出てきてしまいます。
つまりこの他のトランザクションからの影響をなくす分離性とトランザクションのパフォーマンスはトレードオフの関係なのです。
もちろんデータの特性や使われ方によって分離性の保証が優先すべきケース、分離性よりもアクセスパフォーマンスを優先すべきケースがあります。
そこで、この操作は、このレベルまで他のトランザクションからの影響を受けないように保証してくださいということを指定するために分離レベルがあるのです。この分離レベルはSQL単位で指定可能です。
#Db2の分離レベル
分離レベル、そしてそのレベルによる挙動はDBMS製品によって多少異なります。
今回はDb2の分離レベルについて記載します。
Db2では、UR、CS、RS、RRの4つの分離レベルに分かれます。
各分離レベルによって上記の3つの現象が発生することを許容する・しないかが異なります。
以下の表からURが分離レベルが低く(他トランザクションからの影響大)、RRの方が分離レベルが高い(他トランザクションからの影響小)ということがお分りいただけるかと思います。
ちなみにDb2のデフォルトの分離レベルはCSです。
分離レベル | ダーティーリード | ノンリピータブルリード | ファントムリード |
---|---|---|---|
UR | 発生 | 発生 | 発生 |
CS (default) | 発生しない | 発生 | 発生 |
RS | 発生しない | 発生しない | 発生 |
RR | 発生しない | 発生しない | 発生しない |
各分離レベルと一言で簡単にいうと、、
分離レベル | |
---|---|
UR | 一度参照したレコードが、無かったことになってもいい |
CS (default) | 常にコミットされている結果が返されれば、読み直した時にレコードは変更されていてもよい |
RS | 参照したレコードは、更新されたくない、読み直した時に同じレコードが欲しい |
RR | 参照したレコードは、更新されたくない、読み直した時に同じレコードが欲しい |
#どうやってデータの分離性を保証しているのか
ここまではデータの分離性・分離レベルのお話でした。
ここからはどうやってDBMSがこの分離レベルを実現しているのかという話です。
単直に言いますと、表や行などのオブジェクトに対して、ロックを組み合わせることで実現しています。
この分離レベルによって組み合わせるロックのタイプが異なります。
また同じ分離レベルでも参照するときと更新するときではロックの組み合わせは異なります。
このへんのロックのタイプや組み合わせなど詳しい話はここではしません。
#まとめ
-分離性とは、1つのトランザクションは他のトランザクションの処理によって影響を受けないことを保証すること。
-影響をどの程度受けたくないかは、データの使われ方によってケースバイケースなので
分離レベルによって、一度参照した照会結果がどの程度変更されることを許容するかを指定できる!
-分離性はロック機能によって制御されていて、分離レベルの違いはこの取得されるロックの種類のよって実現できる!
最後まで読んでいただきありがとうございました