概要
SQL Serverに、複数のトランザクションが同時に実施されるとき、下記のようなデータの不整合現象が発生する。
・ダーティ リード(dirty read)
トランザクションAが、トランザクションBの処理最中でまだコミットしてないものを、読み出す現象。
・反復不可能読み取り
トランザクションAが、同じレコードを2回読む間に、トランザクションBが該当レコードを更新したため、2回の読む結果が違う現象。
・ファントムリード(Phantom lead)
トランザクションAが、2回読む間に、トランザクションBが削除、挿入をしたため、2回の読む結果が違う現象。
分離レベルとは
上記の不整合現象を防ぐために、トランザクション分離レベルが定義されている。
1、通常類分離レベル(Lockで制御)
・READ UNCOMMITTED
【no Lock】
未コミット状態のデータであっても読み込む。
・READ COMMITTED
【読む文時点だけLock】
コミットされたデータのみを読み込む。
しかし、他Transactionでコミットされた結果が反映されてしまう。
⇒ 同じレコードを2回読む間に変更により【反復不可能読み取り】が発生
・REPEATABLE READ
【Transaction Lock (insert,delete除き)】
他Transactionでコミットされた結果が反映されない。
⇒【反復不可能読み取り】が抑える。
しかし、削除、挿入により不整合【ファントムリード】が発生
・SERIALIZABLE
【Transaction Lock (insert,delete含む全SERIAL)】
他削除、挿入により
【ファントムリード】まで抑える。
効果
【READ UNCOMMITTED】 -> 【READ COMMITTED】 -> 【REPEATABLE READ】 -> 【SERIALIZABLE】
Lockを付けてる期間が多くて、データの整合性が高くなる一方、待ち時間が多くなって、並行性が低くなってしまう。
2、SNAPSHOT類分離レベル(tmpdbとversionで制御)
分離効果は通常との似ているのが、
方式は、lockを使わずTEMPDBを消費してデータを保存して、バージョンでコントロールすること。
で、性能上はupdateやdeleteに悪い影響だが、読むにはよい影響。
###・SNAPSHOT
分離効果は【SERIALIZABLE】と同様
###・READ COMMITTED SNAPSHOT
分離効果は【READ COMMITTED】と同様