トランザクション分離レベル
トランザクション分離レベル (トランザクションぶんりレベル)または 分離レベル (英: Isolation) とは、データベース管理システム上での一括処理(トランザクション)が複数同時に行われた場合に、どれほどの一貫性、正確性で実行するかを4段階で定義したものである。隔離レベル 、 独立性レベルとも呼ばれる。トランザクションを定義づけるACID特性のうち,I(Isolation; 分離性, 独立性)に関する概念である。
概要
編集データベースへの読み書き(トランザクション処理)には処理時間が発生する。複数のトランザクション処理依頼がデータベース管理システムへ行われたとき、これらを処理する1つの方法は逐次的(Serial)に1つずつトランザクションを処理する方法である。トランザクション処理に処理時間がかかることから、後に行われた処理は先に行われた処理が完了するまでの間「待ち」の状態になってしまう。
待ちを最小化するためにはデータベース管理システムが複数のトランザクションを並行(Concurrent)に処理すればよい。しかしトランザクションは必ずしも安全に並列化できるとは限らない。そのためデータベース管理システムは各並行トランザクションが互いに影響を受けず分離された安全な範囲内でトランザクションを並行化する。あるいは、異常な振る舞い(anomalies)を起こしうる分離レベルが低い並行化を許容し、代わりに並行性を高めてトランザクション処理性能を上昇させる[1]。この安全性・一貫性と性能のトレードオフを生む、並行性トランザクションの分離具合がトランザクション分離レベルである[2]。
トランザクション分離レベルはシステム要件に合わせデータベースの設計者によって設定される。例えば一切の異常な振る舞いが許されない金融システムには高いトランザクション分離レベルが設定される(代わりに性能は低い)。またanomaliesの可能性がある分離レベルを選択してもanomaliesを起こしえないトランザクションのみを処理するように設計すれば一貫性を保ちながら高い性能を得ることが可能になる。
分離レベル
編集ANSI/ISO SQL標準で定められている分離レベルは、下記の4種類で定義されている。
- SERIALIZABLE(直列化可能)
- 複数の並行に動作するトランザクションそれぞれの結果が、いかなる場合でも、それらのトランザクションを時間的重なりなく逐次実行した場合と同じ結果となる。このような性質を直列化可能性(Serializability)と呼ぶ.SERIALIZABLEは最も強い分離レベルであり、最も安全にデータを操作できるが、相対的に性能は低い。ただし同じ結果とされる逐次実行の順はトランザクション処理のレベルでは保証されない。
- REPEATABLE READ(読み取り対象のデータを常に読み取る)
- ひとつのトランザクションが実行中の間、読み取り対象のデータが途中で他のトランザクションによって変更される心配はない。同じトランザクション中では同じデータは何度読み取りしても毎回同じ値を読むことができる。
- ただし ファントム・リード(Phantom Read) と呼ばれる現象が発生する可能性がある。ファントム・リードでは、並行して動作する他のトランザクションが追加したり削除したデータが途中で見えてしまうため、処理の結果が変わってしまう。
- READ COMMITTED(確定した最新データを常に読み取る)
- 他のトランザクションによる更新については、常にコミット済みのデータのみを読み取る。 MVCC はREAD COMMITTEDを実現する実装の一つである。
- ファントム・リード に加え、非再現リード(Non-Repeatable Read)と呼ばれる、同じトランザクション中でも同じデータを読み込むたびに値が変わってしまう現象が発生する可能性がある。
- READ UNCOMMITTED(確定していないデータまで読み取る)
- 他の処理によって行われている、書きかけのデータまで読み取る。
- PHANTOM 、 NON-REPEATABLE READ 、さらに ダーティ・リード(Dirty Read) と呼ばれる現象(不完全なデータや、計算途中のデータを読み取ってしまう動作)が発生する。トランザクションの並行動作によってデータを破壊する可能性は高いが、その分性能は高い。
anomaliesとphenomena
編集並列トランザクションを並べた時に起こりうる正常ではない現象(phenomena)としてANSI SQLは以下を定義している[3]。
- Dirty Read
- Non-repeatable Read
- Phantom
またANSI SQLでは指摘されなかった並行トランザクションの起こしうるanomaliesとして以下が挙げられる。
- Dirty Write
- Cursor Lost Update
- Lost Update: read/writeからなるトランザクションが、read/writeの間に行われた別トランザクションのwriteを上書きする異常[4]
- Fuzzy Read
- Read Skew
- Write Skew
分離レベルによって発生しうるanomaliesが異なり、開発者は受け入れられるanomaliesと性能のトレードオフを設計することができる[5]。
脚注
編集- ^ Lower isolation levels increase transaction concurrency but risk showing transactions a fuzzy or incorrect database. doi: 10.1145/568271.223785
- ^ Running concurrent transactions at different isolation levels allows application designers to trade throughput for correctness. doi: 10.1145/568271.223785
- ^ These levels are defined with the classical serializability definition, plus three prohibited action subsequences, called phenomena: Dirty Read, Non-repeatable Read, and Phantom. doi: 10.1145/568271.223785
- ^ The problem, as illustrated in history H4, is that even if T2 commits, T2's update will be lost. doi: 10.1145/568271.223785
- ^ Running concurrent transactions at different isolation levels allows application designers to trade throughput for correctness doi: 10.1145/568271.223785
参考文献
編集- Berenson, Hal; Bernstein, Phil; Gray, Jim; Melton,Jim; O'Neil, Elizabeth; O'Neil, Patrick (1995-05-22). “A critique of ANSI SQL isolation levels” (英語). ACM SIGMOD Record 24 (2): 1–10.doi:10.1145/568271.223785.