隔離レベル
隔離レベルは、トランザクションが他の並行トランザクションの影響からどの程度保護されるかを定義し、高い並行性とスループットのために一部の隔離保証を犠牲にします。
Definition
隔離レベルとは、トランザクションが観測しうる並行性異常の仕様であり、高レベルではより多くの異常を防止しますが(完全な直列化可能性まで)、並行性が低下するコストがかかります。一方、低レベルではパフォーマンスと引き換えに特定の異常を許容します。
Scope
このトピックでは、標準的な隔離レベル(リードアンコミッテッド、リードコミッテッド、リピータブルリード、シリアライザブル)について、それぞれが許容または防止する現象(ダーティリード、ノンリピータブルリード、ファントム)の観点から定義し、それらを許容される異常の観点から再構築した影響力のある批判、および実用的に重要なスナップショット隔離とその書き込みスキューなどの異常について扱います。一貫性と並行性のトレードオフについて論じます。これらのレベルを実装する基盤となるロックおよび多版管理メカニズムは除外します。
Core questions
- ダーティリード、ノンリピータブルリード、ファントムといった異常のうち、各隔離レベルはどれを許容しますか?
- SQL標準は4つの隔離レベルをどのように定義していますか?
- 研究者たちは、異常ベースの定義が曖昧であると批判したのはなぜですか?
- スナップショット隔離はどこに位置し、どのような異常(書き込みスキューなど)を許容する可能性がありますか?
- アプリケーションは特定のワークロードに対してどのように隔離レベルを選択しますか?
Key concepts
- リードアンコミッテッド
- リードコミッテッド
- リピータブルリード
- シリアライザブル
- ダーティリード
- ノンリピータブルリード
- ファントムリード
- スナップショット隔離と書き込みスキュー
Key theories
- 異常ベースの隔離レベル
- SQL標準は、ダーティリード、ノンリピータブルリード、ファントムという3つの現象のうち、どれを許容するかによって隔離レベルを定義します。これは、リードアンコミッテッド(すべて許容)からシリアライザブル(すべて不許容)まで多岐にわたります。
- ANSI隔離レベルへの批判
- Berensonらは、標準の現象ベースの定義が曖昧であり、多版管理システムを明確に特徴づけていないことを示し、元の定義では捉えられていなかった、広く実装されている独立したレベルとしてスナップショット隔離を導入しました。
- スナップショット隔離とその異常
- スナップショット隔離では、各トランザクションは開始時点の一貫したスナップショットを読み取り、読み取りロックなしで強力な読み取り動作を提供しますが、書き込みスキューなどの非直列化可能な異常を許容する可能性があるため、シリアライザブルスナップショット隔離が動機付けられます。
Clinical relevance
隔離レベルは、アプリケーション開発者にとって日常的でありながら重要な設定選択です。弱すぎるレベルを選択すると、微妙な異常によってデータが密かに破損する可能性があり、常にシリアライザブルを使用するとスループットが低下する可能性があるため、正しく高性能なトランザクションアプリケーションを構築するためには、これらのレベルを理解することが不可欠です。
History
ANSI/ISO SQL標準は、許容される現象の観点から隔離レベルを定義しました。1995年のBerenson、Bernstein、Gray、およびO'Neilsによる批判は、これらの定義の曖昧さを露呈し、スナップショット隔離を特徴づけました。これは、主流の多版管理データベースが採用しました。その後の研究では、残りの異常ギャップを解消するために、シリアライザブルスナップショット隔離が定義されました。
Debates
- 異常による隔離の定義と直列化可能性による定義
- 標準の異常リストによる定義は記述が容易ですが曖昧であり、多版管理システムには適合しません。代替案として、直列化可能性によって直接正しさを定義する方法がありますが、これはより明確であるものの、開発者が実際に設定するレベルにマッピングするのがより困難です。
Key figures
- Jim Gray
- Philip Bernstein
- Hal Berenson
Related topics
Seminal works
- berenson1995
- gray1992
Frequently asked questions
- ノンリピータブルリードとファントムリードの違いは何ですか?
- ノンリピータブルリードは、トランザクションが同じ行を2回読み取り、その間に別のトランザクションが更新したために異なる値を見る場合に発生します。ファントムリードは、トランザクションが検索条件付きのクエリを再実行し、別のトランザクションが挿入した新しい行を見る場合に発生します。リピータブルリードは前者を防ぎますが、ファントムを確実に防ぐのはシリアライザブルのみです。
- スナップショット隔離はシリアライザブルと同じですか?
- いいえ。スナップショット隔離は各トランザクションに一貫したスナップショットを提供し、ダーティリードとノンリピータブルリードを防ぎますが、完全にシリアライザブルではありません。これは、2つのトランザクションが重複するデータを読み取り、互いに独立した更新を行うことで制約に違反する書き込みスキュー異常を許容します。シリアライザブルスナップショット隔離は、そのような異常を排除するためにこれを拡張したものです。