トランザクションの分離
DBMSは個々のトランザクションついて分離性を維持する制御を行う。
SQLの同時実行の、副作用
DBMSにおいて、同時処理を行うことで発生する副作用として、
代表的なものに以下の3つがある。
1.ダーティーリード
コミットされていない未確定の変更を、読み込めてしまう副作用のことを、ダーティーリード
と呼ぶ。こうして読み取ってしまった未確定の情報をもとにして、別の処理を行ってしまうため、非常に危険。
2.反復不能読み取り
SELECT文の実行後、データの更新(UPDATE)が行われると、次回SELECTした際にクエリ実行結果が異なってしまう副作用。データ整合性が崩れる原因となる。
3.ファントムリード
2回のSELECT文の間に、INSERT文で行を追加されると、2回の検索結果が変わってしまうという副作用。
1回目の検索結果の行数に依存するような処理を行う場合、問題となることがある。
トランザクションの分離
上記3つの副作用は、トランザクションによって解決することが可能。
DBMSは個々のトランザクションついて分離性を維持する制御を行うため、内部でロック(lock)
と呼ばれる仕組みを使う。
自分のトランザクションがコミットまたはロールバックで終了すると、ロックが解除され、他の人のトランザクションがその行を読み書き可能になる。
分離レベル
一般的なトランザクション分離レベル
(下に行くほど処理速度は高速だが、危険度は高い。)
分離レベル | ダーティーリード | 反復不能読み取り | ファントムリード |
---|---|---|---|
READ UNCOMMITTED | 恐れあり | 恐れあり | 恐れあり |
READ COMMITTED | 発生しない | 恐れあり | 恐れあり |
REPEATABLE READ | 発生しない | 発生しない | 恐れあり |
SERIALIZABLE | 発生しない | 発生しない | 発生しない |
トランザクション分離レベルの指定
SET TRANSACTION ISOLATION LEVEL 分離レベル名
SET CURRENT ISOLATION 分離レベル名
参考
参考図書 : スッキリわかるSQL入門