トランザクション分離レベル 【transaction isolation level】
概要
トランザクション分離レベル(transaction isolation level)とは、データベース管理システム(DBMS)が複数のトランザクション処理を同時に実行する際、どの程度の独立性を保証するかを表すレベルのこと。トランザクション処理は複数のデータ処理を一体不可分の単位として扱う実行方式で、実行の前後でデータに矛盾が無いことが要請される。実際のコンピュータシステムでは複数のトランザクションを同時に稼働させる必要があり、他のトランザクションの操作によって処理に矛盾を来さないよう適切に制御する必要がある。
トランザクションの並行性と独立性はトレードオフ(あちらを立てればこちらが立たず)の関係にあり、完全な独立性を求めれば並行に処理を進めることは難しくなり性能が犠牲になる。なるべく処理を阻害せず高速に処理しようとすれば独立性が損なわれ、他のトランザクションの処理の影響を受けやすくなる。
それぞれをどの程度の水準で両立(妥協)するかを表したのがトランザクション分離レベルで、よく知られるSQL標準では最も独立性の高い「SERIALIZABLE」から最も低い「READ UNCOMMITED」まで4段階のレベルが定義されている。
SERIALIZABLE
最も独立性(安全性)が高い分離レベルで、トランザクションを順番に実行(直列化)したのと同じように、他のトランザクションのデータ更新の影響をまったく受けない。アクセスが競合すると「先客」のトランザクションの終了を待たなければならないため性能は最も低い。
REPEATABLE READ
2番目に独立性が高い分離レベルで、他のトランザクションによるデータ更新の影響を受けず、トランザクション実行中は何度繰り返し対象データを読み取っても同じ値が返ってくる。しかし、他のトランザクションによるレコードの追加・削除の影響は受けるため、「ファントムリード」と呼ばれる現象が生じることがある。
READ COMMITED
3番目に独立性が高い分離レベルで、トランザクション実行中に他のトランザクションがコミットした変更の影響を受ける。ファントムリードに加え、何度も同じデータを読み込むと他のトランザクションによる更新で値が変わってしまう「ノンリピータブルリード」現象が生じることがある。多くの著名RDBMSのデフォルトの分離レベルである。
READ UNCOMMITED
最も独立性が低い分離レベルで、トランザクション実行中に他のトランザクションが引き起こすあらゆる更新・変更の影響を受ける。ファントムリード、ノンリピータブルリードに加え、処理途上や不完全な状態のデータを読み込んでしまう「ダーティリード」現象が生じる可能性がある。処理を妨げるロックなどは最小限に抑えられるため最も高速に動作する。