ANSISQL分離レベルの批評



Critique Ansi Sql Isolation Levels



ANSISQL分離レベルの批評
ANSISQL分離レベルに対する批判

要約:ANSI SQL-92 [MS、ANSI]は、現象(現象、読み取り時の現象)に基づいて分離レベルを定義します:ダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取り。この記事では、これらの現象とANSI SQL定義が、さまざまな分離レベル標準のロック実装など、いくつかの一般的な分離レベルを正しく特徴付けていないことを示しています。この論文は、現象の記述における曖昧さを調査し、さらにより正式な記述を提案し、それは分離タイプをよりよく特徴づける新しい現象を紹介します。最後に、スナップショットアイソレーションと呼ばれる重要なマルチバージョンアイソレーションタイプが定義されています。



1はじめに

異なる分離レベルで並行トランザクションを実行することにより、プログラマーは正確性を確保しながら並行性とスループットを比較検討できます。分離レベルを低くすると、トランザクションの同時実行性が高まり、トランザクションが不明瞭または不正確なデータベース状態に準拠する可能性があります。驚いたことに、より低い分離レベルで実行されるトランザクション(コミットされていないデータの読み取りまたは古いデータの読み取り)[GLPT]は、一部のトランザクションが最も高い分離レベル(完全にシリアル化可能)で実行されるときに同時に実行できます。もちろん、より低い分離レベルで実行されているトランザクションは、無効なデータを生成する可能性があります。プログラマーは、より高い分離レベルで実行されている後続のトランザクションがこれらの無効なデータにアクセスしてそのようなエラーを伝播するのを防ぐ必要があります。



ANSI / ISO SQL-92仕様[MS、ANSI]は、4つの分離レベルを定義しています:(1)コミットされていない読み取り(READ UNCOMMITTED)、(2)コミットされた読み取り(READ COMMITTED)、(3)繰り返し可能な読み取り(REPEATABLE READ)、(4 )シリアル化可能(SERIALIZABLE)。

これらのレベルは、従来のシリアル化定義と、フェノメナという名前の3つの禁止されたサブシーケンスを使用して定義されます。これには、ダーティリード、繰り返し不可能なリード、ファントムリードが含まれます。現象の概念はANSI仕様で明示的に定義されていませんが、仕様では、現象は異常な(おそらくシリアル化できない)動作を引き起こす可能性のある操作上のサブシーケンスであると述べています。 ANSI現象を追加することを提案するときは、これらの異常を参照します。後で示すように、異常と現象の間には技術的な違いがありますが、この区別は一般的な理解にとって重要ではありません。

ANSI分離レベルは、ロックスケジューラの動作に関連しています。一部のロックスケジューラでは、トランザクションがロック要求の範囲と期間を変更できるため、純粋な2段階のロックから逸​​脱します。このアイデアは[GLPT]によって導入されました。これは、一貫性の程度を3つの角度(ロック、データフローグラフ、および例外)で定義します。現象(または例外)による分離レベルの定義は、ロックに基づいて実装されていないSQL標準を許可するように設計されています。



この記事では、分離レベルを定義する現象メソッドのいくつかの欠点について説明します。 3つのANSI現象はあいまいであり、最も寛大な解釈であっても、実行の履歴で発生する可能性のある異常な動作の一部は除外されません。これは、直感に反する結果につながります。特に、ロックベースの分離レベルには、同等のANSI現象とは異なる特性があります。商用データベースシステムは通常、ロックを使用して分離レベルを達成するため、状況は厄介です。さらに、ANSI現象では、商用システムで一般的な分離レベルの多くのタイプの動作を区別できません。このホワイトペーパーでは、これらの分離レベルを特徴付ける他の現象について説明します。

セクション2では、分離レベルの基本的な用語を紹介し、ANSISQLとロック分離レベルを定義します。

セクション3では、ANSI分離レベルのいくつかの欠点を探り、新しい現象を示します。他の一般的な分離レベルも定義されています。これらの定義は、1977年に定義されたANSISQL分離レベルと一貫性の程度をマップします[GLPT]。また、ChrisDateによって定義されたカーソルの安定性と反復可能な読み取り[DAT]も含まれています。統一されたフレームワーク内で分離レベルについて議論することで、独立した用語の誤解を減らすことができます。

セクション4では、スナップショットアイソレーションと呼ばれるマルチバージョン同時実行制御メカニズムを紹介します。これは、ANSI SQL現象の使用を回避しますが、シリアル化することはできません。スナップショットアイソレーション自体は、コミットされた読み取りと繰り返し可能な読み取りの間に分離レベルを提供するため、興味深いものです。マルチバージョンデータの分離レベルを従来のシングルバージョンロック直列化可能性理論に規定する新しい方法論(この会議ドキュメントの長いバージョンで提供)があります。

セクション5では、セクション3と4で導入された分離レベルを区別するために、いくつかの新しい例外について説明します。ここで紹介する拡張ANSI SQL現象には、スナップショット分離とカーソル安定化を特徴付ける機能がありません。

セクション6は、要約と結論を示しています。

2.分離の定義

2.1シリアル化の概念

トランザクションとロックの概念は、文献[BHG、PAP、PON、GR]に詳しく説明されています。次の数段落では、これらの記事で使用されている用語を確認します。

トランザクションは、グループを組み合わせてデータベースをある状態から別の状態に移行する操作のグループです。履歴とは、一連のトランザクションのインターリーブされた実行を、操作が順序付けられた後の一連の線形操作にモデル化することを意味します。操作とは、特定のデータ項目の読み取りと書き込み(挿入、更新、削除など)を意味します。 。同じデータアイテムの履歴内の2つの操作が異なるトランザクションによって実行され、操作の少なくとも1つがアイテムに書き込まれる場合、2つの操作は競合していると言われます(翻訳者注:データ関連と見なすことができます) 。 [EGLT]の後、この定義は「データ項目」の意味を広く解釈します。これは、テーブル行、ページ上のスペース、テーブル全体、または通信オブジェクト(キュー上のメッセージなど)です。 )。競合する操作は、述語ロックによって保護されたデータ項目のセットまたは単一のデータ項目でも発生する可能性があります。

特定の履歴により、複数のトランザクション間の時間軸データフロー依存関係グラフを生成できます。履歴で送信されたトランザクションの操作は、ポイントとして表されます。トランザクションT1の操作op1が履歴内のトランザクションT2の操作op2と競合する場合、依存関係グラフのエッジになります。 (翻訳者注:つまり、操作がポイントであり、競合がエッジであり、依存関係グラフが作成されます)。 2つの履歴が等しい場合、履歴で送信されたトランザクションと依存関係のグラフは同じです。履歴はシリアル化可能です。つまり、履歴はシリアル履歴、つまり、依存関係グラフ(複数のトランザクション間の時間ベースのデータフローグラフ)および順次文字列と同等と見なすことができます。複数のトランザクションを実行する行の履歴の依存関係グラフは同じです。

2.2 ANSISQL分離レベル

ANSI SQL分離設計者は、ロックベースだけでなく、さまざまな実装を可能にする定義を探しています。これらは、次の3つの現象を使用して分離を定義します。

P1(ダーティリーディング) :トランザクションT1はデータ項目を変更します。別のトランザクションT2は、T1がCOMMITまたはROLLBACKを実行する前にデータ項目を読み取ります。その後、T1がROLLBACKを実行すると、T2はコミットされていないデータ項目を読み取ります。

P2(繰り返し不可の読み取りまたはファジー読み取り) :トランザクションT1はデータ項目を読み取ります。別のトランザクションT2は、データ項目を変更または削除して送信します。 T1がデータ項目を再読み取りしようとすると、変更された値が表示されるか、データ項目が削除されていることがわかります。

P3(ファントム) :トランザクションT1は、いくつかを満たすデータ項目のセットを読み取ります。次に、トランザクションT2は、T1のを満たすデータ項目を作成して送信します。その後、T1が同じを使用して読み取りを繰り返すと、最初のデータとは異なるグループデータ項目が取得されます。

これらの現象はいずれも、シリアル履歴では発生しません。シリアル化の定理では、シリアル化の履歴で発生することはありません[EGLT、BHGの定理3.6、G Rセクション7.5.8.2、PONの定理9.4.2]。

読み取り、書き込み、コミット、およびアボートで構成される履歴は、省略表記で表すことができます。「w1 [x]」は、データ項目xへのトランザクション1の書き込みを表します(データ項目は「変更済み」です)。 'r2 [x]'は、トランザクション2がxを読み取ることを示します。トランザクション1は、述語Pの読み取りと書き込みを満たします。レコードのセットは、それぞれr1 [P]とw1 [P]で表されます。トランザクション1のcommitとROLLBACKは、それぞれ「c1」と「a1」として示されます。

現象P1は、次のことを許可しないと言い換えることができます。

(2.1)w1 [x]。 。 。 r2 [x]。 。 。 (a1とc2のいずれかの順序)

P1のセマンティクスはあいまいです(翻訳者注:2番目にコミットされたトランザクションのセマンティクスは、最初に中止されたトランザクションによって書き込まれたデータを読み取ります)。実際、T1を一時停止する必要があることを強調しているわけではなく、これが発生した場合、不整合が発生する可能性があることを単に指摘しています。 P1の説明を読んだ人の中には、次のように説明されている人もいます。

(2.2)w1 [x] ... r2 [x] ...((c1またはa1)および(c2またはa2)の任意の順序)

P1の(2.2)バリアントでは、T1が履歴内のデータ項目xを変更することはできません。その後、T2は、T1がコミットまたは中止する前に、データ項目の一連の操作を読み取ります。 T1アボートまたはT2送信は強調されていません。

定義(2.2)は、4つの可能なトランザクションT1およびT2すべてのコミットアボートシーケンスを禁止しているのに対し、(2.1)は4つのうち2つのみを禁止しているため、(2.1)よりもP1に対して寛容です。 (2.2)をP1の意味として説明し、将来の異常な状況の実行順序を禁止します。 (2.2)P1の緩い解釈、および(2.1)P1の厳密な解釈と呼びます。解釈(2.2)は現象につながる可能性のある現象を指定し、(2.1)は実際の異常を指定します。それぞれP1およびA1として表されます。したがって:

P1 :w1 [x] ... r2 [x] ...((c1またはa1)および(c2またはa2)の任意の順序)

A1 :w1 [x] ... r2 [x] ...(a1とc2は任意の順序で)

同様に、現象P2とP3も厳密で緩い解釈を持ち、P2とP3は緩く解釈され、A2とA3は厳密に説明されます(翻訳者注:Pは異常な読み取り現象の操作シーケンスを示し、Aはデータの不整合を引き起こす操作を示します)シーケンス):

P2 :r1 [x] ... w2 [x] ...((c1またはa1)および(c2またはa2)の任意の順序)

A2 :r1 [x] ... w2 [x] ... c2 ... r1 [x] ... c1

P3 :r1 [P] ... w2 [y in P] ...((c1またはa1)および(c2またはa2)任意の順序)

A3 :r1 [P] ... w2 [y in P] ... c2 ... r1 [P] ... c1

セクション3は、開発された代替概念の詳細を分析し、現象の大まかな説明の必要性を示唆しています。 ANSI SQL P3の英語のセマンティクスは、(スコープ内の)述語の挿入のみを禁止しますが、上記のP3は、述語を満たすタプルセットを読み取った後、述語を満たすタプルの書き込み(挿入、更新、削除)を完全に禁止することに注意してください。

多値履歴(略してMV-history、[BHG]、第5章を参照)の概念については、この記事の後半で説明します。ここでは詳細に説明しませんが、データ項目の複数のバージョンが同時にマルチバージョンシステムに存在する場合があります。読み取り操作では、読み取るバージョンを明示的に指定する必要があります。標準のロックスケジューラに基づいて、ANSI分離レベル定義をマルチバージョンシステムおよびシングルバージョンシステム(SV履歴)に関連付ける試みが行われています。それでも、P1、P2、およびP3現象のセマンティクスは、単一バージョンの履歴に限定されます。次のセクションで説明します。

ANSI SQLは、表1のマトリックスを介して4つの分離レベルを定義します。各分離レベルは、トランザクションで禁止されている(緩いまたは厳密に解釈されている)現象によって特徴付けられます。ただし、ANSI SQL仕様では、これらの現象のみに基づいてシリアル化可能な分離レベルを定義していません。 「ANSI」の4.28「SQLトランザクション」は、シリアライズ可能な分離レベルが「コンセンサスの完全にシリアライズ可能な実行」を提供する必要があることを示しています。この追加の条件と比較すると、この表は、3つの現象をシリアル化できないという一般的な誤解を招きます。これらの3つの現象の履歴は、表1ではANOMALY SERIALIZABLEと呼ぶことはできません(翻訳者注:例外的なシリアル化とは、「実際の」ではなく、禁止された例外(または現象)に基づくシリアル化を意味します)。

歴史におけるゆるい解釈は厳密な解釈をはるかに超えており、孤立レベルは彼らが経験することを禁じられている現象によって定義されているからです。セクション3での大まかな説明についての説明は、より制限的な分離レベルについて説明したいことを意味します(より多くの履歴が禁止されます)。ただし、セクション3は、P1、P2、およびP3の解釈が緩い場合でも、これらの現象は禁止されており、真のシリアル化の保証はないことを示しています。 ANSIでP3を削除し、4.28のみを使用してANSIシリアル化を定義する方が簡単です。表1は最終結果ではなく、表3に置き換えられることに注意してください。

2.3ロック

ほとんどのSQL製品は、ロックベースの分離を使用しています。したがって、いくつかの問題はありますが、ロックの観点からANSISQL分離レベルを特徴付けることは効果的です。

ロックベースのスケジューリングの下で​​トランザクションが実行する読み取り/書き込みは、データ項目またはデータ項目のセットに対して読み取り(共有)および書き込み(排他的)ロックを要求します。 2つの異なるトランザクションのロックが同じデータ項目に対応している場合、それらの少なくとも1つが書き込みロックであると競合が発生します。

読み取り(または書き込み)述語ロック(によって決定されるデータ項目の特定のセットの下)は、実際には、を満たすすべてのデータ項目に対するロックです。これは、データベースに存在するデータと、現在データベースに存在しないすべてのファントムデータ項目(挿入されている場合、または現在のデータ項目が満たされるように更新されている場合)が含まれるため、無限セットになる可能性があります。 SQLの用語では、述語ロックは、述語を満たすすべてのデータ項目と、INSERT、UPDATE、またはDELETEの後の述語を満たすすべてのデータ項目をカバーします。異なるトランザクションの2つの述語ロックが書き込みロックであり、両方のロックが同じ(おそらくファントム)データ項目をカバーしている場合、2つの述語ロックは競合します。データ項目ロック(レコードロック)は、述語が特定のレコードを指定する述語ロックです。

トランザクションには整形式の書き込み(読み取り)があり、データ項目または述語で定義されたデータ項目セットを書き込む(読み取る)前に、各データ項目または述語が書き込みロック(読み取りロック)を要求する必要があります(翻訳者注:つまり、読み取り(書き込み)の場合、指定されたデータ項目セットには読み取り(書き込み)ロックが1つだけあります。トランザクションは整形式であり、トランザクションには適切な形式の読み取りと書き込みが必要です。 2フェーズの書き込み(読み取り)を伴うトランザクションでは、書き込み(読み取り)ロックが解放された後、データ項目に新しい書き込み(読み取り)ロックが設定されていない必要があります。トランザクションは2フェーズであり、一部のロックを解放した後、トランザクションが新しいロック(読み取りまたは書き込みロック)を要求しないようにする必要があります。

長いロックでは、ロックをコミットまたは中止する必要があります。それ以外の場合は、ショートロックです。実際、ショートロックは通常、操作が完了した直後に解放されます。

1つのトランザクションが1つのロックを保持し、別のトランザクションが競合するロックを要求した場合、前のトランザクションの競合するロックが解放されるまで、新しいロック要求は許可されません。

基本的なシリアル化の定理は、シリアル化を保証する整形式の2フェーズロックの優れた形式です。2ステージロックの各履歴は、いくつかのシリアル履歴と同等です。逆に、トランザクションが適切な形式または2段階ではない場合、(劣化の場合を除いて)シリアル化不可能な実行[EGLT]の履歴が発生する可能性があります。 [GLPT]ペーパーでは、4つの一貫性を定義し、ロック、依存関係、および例外ベースの表現の同等性を説明しようとしています。例外の定義(定義1を参照)があいまいすぎます。著者は彼の定義について引き続き批判されています([GR]も参照)。歴史と依存関係のグラフまたはロックのより数学的な定義だけが、時の試練に耐えてきました。

表2 ロック定義に基づく整合性と分離レベル

整合性レベル=分離レベル

データ項目と述語のロックを読み取る

データ項目と述語にロックを書き込む

次数0

必要なし

良い書き方

次数1 =ロック読み取り非コミット

必要なし

良い書き方、長い書き込みロック

次数2 =ロックREADCOMMITTED

良い読み方、短い読みロック

良い書き方、長い書き込みロック

カーソルの安定性(カーソルの安定性、セクション4.1を参照)

良い形式の読み取り、読み取りロックを保持するカーソル、短い述語ロック

良い書き方、長い書き込みロック

繰り返し可能な読み取りをロックする

良好な形式の読み取り、長い読み取りロック(データ項目の場合)、短い読み取りロック(述語の場合)

良い書き方、長い書き込みロック

次数3 =シリアル化可能なロック(シリアル化可能なロック)

良い読み方、長い読みロック

良い書き方、長い書き込みロック

表2は、ロック範囲(データ項目または述部)、モード(読み取りまたは書き込み)、およびその期間(短いまたは長い)に基づいて、複数の分離タイプを定義しています。 ANSI SQL分離レベルの要件を満たすために、ロック読み取り非コミット、ロック読み取りコミット、ロック反復可能読み取り、ロックシリアル化可能のロックベースの分離レベルを検討しますが、示されているように、これらは表1とは完全に異なります。 ANSISQL現象に基づく分離レベルからのロックによって定義される分離レベル。区別するために、表2のレベルには、表1の「ANSI」プレフィックスではなく「ロック」というラベルが付いています。

[GLPT]は、レベル0の整合性を定義して、ダーティな読み取りと書き込みを許可します。操作する必要があるのはアトミック性のみです。次数1、2、および3は、ロック読み取りがコミットされていない、ロック読み取りがコミットされている、およびロックがシリアル化可能であることに対応します。分離とロックの繰り返し可能な読み取り一致はありません。

DateとIBMは当初、シリアライズ可能またはロック可能なシリアライズ可能を表すために「RepeatableReads」[DAT、DB2]という名前を使用していました。同じですが、これは[GLPT]の用語「Isolation3」よりもわかりやすい名前のようです。繰り返し可能な読み取りのANSISQLの意味は、残念なことに、Dateの元の定義とは異なります。現象P3は、ANSI SQLの繰り返し可能な読み取り分離レベルでは考慮されていませんが、P3の定義からわかるように、読み取りは繰り返し可能ではありません。 (翻訳者注:P3は「繰り返し可能な読み取り」の中国語の意味に違反します)ANSI定義に対応するために、表2の「繰り返し可能な読み取りのロック」という用語を誤用しています。同様に、Dateは、より理解しやすい次数2の分離名として「カーソル安定化」という用語を使用し、以下のセクション4.1で説明するように、失われたカーソル更新に対する保護を強化します。

定義:L2標準に準拠するすべてのシリアル化不可能な履歴がL1を満たし、少なくとも1つのシリアル化不可能な履歴がL1で発生し、L2では発生しない場合、分離レベルL1は分離レベルL2よりも弱い(弱い)か、L2はL1よりも強く、L1として表されます

分離レベルを比較する場合、非シリアル化の履歴でのみ区別します。たとえば、一部の履歴はあるレベルで発生し、別のレベルでは発生しない場合があります。 2つの分離レベルは、表示が許可されているシリアル化履歴も異なる場合があります。ロックスケジューラがすべての可能なシリアル化可能な履歴を受け入れるわけではないことはよく知られていますが、ロックはシリアル化できる==シリアル化できると考えています。この分離レベルは、シリアル化可能な履歴をあまり多く許可しないため、実用的ではない可能性がありますが、ここではそれらを考慮しません。

結論は次のとおりです。これらの定義といくつかの簡単な例は、

結論1 :ロック読み取りがコミットされていません

次のセクションでは、ANSIとロックベースの分離レベルの定義の比較に焦点を当てます。

3. ANSISQL分離レベルを分析します

良い結論から始めて、ロック分離レベルはANSISQL要件を満たしています。

結論2 :表2のロックプロトコルは、少なくとも表1に対応するピクセルベースの分離レベルと同じくらい強力なロック分離レベルを定義します。[OOBBGM]の証明を参照してください。

したがって、ロック分離レベルは、少なくとも同じ名前のANSIレベル分離と同等です。彼らはもっと孤立していますか?答えは、最低レベルでも「はい」です。 「ダーティライト」と呼ばれるものを回避するために長い書き込みロックを提供するためにロック読み取りは送信されませんが、ANSISQLはANSIシリアル化可能ベースの異常な動作を除外しません。

P0(ダーティライト):トランザクションT1はデータ項目を変更します。次に、別のトランザクションT2は、T1がCOMMITまたはROLLBACKを実行する前に、データ項目をさらに変更します。 T1またはT2が次にROLLBACKを実行する場合、正しいデータ値が何であるかは明確ではありません。大まかな説明は次のとおりです。

P0:w1 [x] ... w2 [x] ...((c1またはa1)および(c2またはa2)の任意の順序)

ダーティが十分でない理由の1つは、データベースの整合性に違反する可能性があることです。 xとyの間に制約があり(たとえば、x = y)、単独で実行した場合、T1とT2はそれぞれ制約の一貫性を維持するとします。ただし、2つのトランザクションがxとyを異なる順序で書き込む場合、この制約は簡単に違反されます。これは、ダーティ書き込みがある場合にのみ発生します。たとえば、履歴がw1 [x] w2 [x] w2 [y] c2 w1 [y] c1の場合、T1からyおよびT2からxの間の変更は「存続」です。 T1がxとyの両方に1を書き込み、T2が2を書き込む場合、結果はx = 2、y = 1になります。x= y制約の違反。

[GLPT、BHG]や他の場所で説明されているように、自動トランザクションロールバックはP0の重要性のもう1つの理由です。 P0保護がないと、システムはイメージを復元して更新を元に戻すことはできません。履歴を考えてみましょう:w1 [x] w2 [x] a1。 xの前のイメージを復元してw1 [x]を元に戻すことは望ましくありません。これにより、w2の更新が上書きされるためです。ただし、プレイメージを復元せず、トランザクション2が後で中止された場合、プレイメージを復元してw2 [x]を元に戻すことはできません。これが、最も弱いロックシステムでさえ長い書き込みロックを持っている理由です。そうしないと、リカバリシステムが無効になります。

結論3 :ANSI SQL分離は、すべての分離レベルで少なくともP0を必要とするように変更する必要があります。

私たちは、3つのANSI現象の大まかな説明が必要であると信じています。厳密な説明は次のとおりです。

A1 :w1 [x] ... r2 [x] ...(a1とc2のいずれかの順序)(ダーティリード)

A2 :r1 [x] ... w2 [x] ... c2 ... r1 [x] ... c1(ファジーまたは繰り返し不可の読み取り)

A3 :r1 [P] ... w2 [y in P] ... c2 .... r1 [P] ... c1(ファントム)

上記の表1は、読み取り分離の履歴が例外A1から禁止されていることを示しています。分離の履歴を繰り返し読み取って、例外A1とA2、および例外A1、A2、A3の履歴分離例外を無効にすることができます。シリアル化できます。過去のH1を考えてみましょう。銀行の残高ラインxとyの間で$ 40を転送します。

H1:r1 [x = 50] w1 [x = 10] r2 [x = 10] r2 [y = 50] c2 r1 [y = 50] w1 [y = 90] c1

H1はシリアル化できません。これは、古典的な一貫性のない分析の問題です。その中で、トランザクションT1はxからyに40元を転送し、合計残高を100にする必要がありますが、T2は合計残高60の不整合状態を読み取ります。履歴H1は、異常A1、A2、またはA3に違反しません。 A1の場合、2つのトランザクションの1つを中止する必要があります(翻訳者注:つまり、未送信の読み取りには1つのトランザクションの読み取りが必要で、別のトランザクションはコミットを終了しますが、両方のトランザクションはH1でコミットされます)。同じトランザクションA3によって2回目に読み取られるには、述語範囲内で値を変更する必要があります。これらのことはいずれもH1では発生しません。 A1、現象P1の大まかな説明を考えると。

P1:w1 [x] ... r2 [x] ...((c1またはa1)および(c2またはa2)の任意の順序)

H1は明らかにP1に違反しました。したがって、ANSIの定義はA1ではなくP1を説明することを目的としており、大まかな説明が正しい説明であると考えています。

同様の議論は、P2はA2ではなくANSI定義と見なされるべきであることを示唆しています。これら2つの解釈を区別する歴史は次のとおりです。

H2:r1 [x = 50] r2 [x = 50] w2 [x = 10] r2 [y = 50] w2 [y = 90] c2 r1 [y = 90]

H2はシリアル化できません。これは、T2が合計140の残高を確認する、もう1つの古典的な不整合分析です。今回、トランザクションはダーティ(つまりコミットされていない)データを読み取りませんでした。したがって、P1は満たされます。また、データ項目が2回読み取られることはなく、述部範囲内のデータが変更されることもありません。 H2の問題は、T1がyを読み取るときに、xの値が期限切れになっていることです。 T2がxを再度読み取ると、変更されますが、T2は2回読み取られないため、A2は適用されません。 A2の代わりにP2を使用すると、大まかな説明でこの問題を解決できます。

P2:r1 [x] ... w2 [x] ...((c1またはa1)および(c2またはa2)任意の順序)

w2 [x = 20]が発生すると、H2はr1 [x = 50]をカバーするため、正しくなくなります。最後に、A3と履歴H3について考えてみましょう。

A3:r1 [P] ... w2 [y in P] ... c2 ... r1 [P] ... c1(ファントム)

H3:r1 [P] w2 [yをPに挿入] r2 [z] w2 [z] c2 r1 [z] c1

ここでT1が実行され、従業員のリストが検索されます。次に、T2は新しい従業員の挿入を実行してから、会社の従業員数zを更新します。その後、T1は従業員数を読み取り、違いを確認します。この履歴は明らかにシリアル化できませんが、述語範囲が2回アクセスされていないため、A3で許可されています。繰り返しますが、P3の大まかな説明はこの問題を解決します。

P3:r1 [P] ... w2 [y in P] ...((c1またはa1)および(c2またはa2)任意の順序)

P3が無効になっている場合、履歴H3は無効です。これは明らかにANSIの意図です。上記の議論は、以下の結果を証明するのに役立ちます。

結論4 :A1、A2、A3の厳密な解釈には、予期しない欠点があります。正しい説明は緩いです。 ANSIは、P1、P2、およびP3を定義することを目的としています。

結論5 :ANSISQL分離現象は不完全です。まだ発生する可能性のあるいくつかの例外がまだあります。ロックの定義を完了するには、新しい現象を定義する必要があります。さらに、P3を再定義する必要があります。以下の定義では、履歴制限(c2またはa2)を適用しない操作を削除します。

P0 :w1 [x] ... w2 [x] ...(c1またはa1)(ダーティライト)

P1 :w1 [x] ... r2 [x] ...(c1またはa1)(ダーティリード)

P2 :r1 [x] ... w2 [x] ...(c1またはa1)(あいまいまたは繰り返し不可能な読み取り)

P3 :r1 [P] ... w2 [y in P] ...(c1またはa1)(ファントム)

ANSI SQL P3は述語の挿入(および更新)のみを禁止しているのに対し、上記のP3の定義は、述語を満たす書き込みの読み取りを禁止していることに注意してください。書き込みは挿入、更新、または削除です。

これらの現象に対して提案されているANSI分離レベルの定義を表3に示します。

単一のバージョン履歴の場合、P0、P1、P2、およびP3の現象は、現象の「偽の」ロックバージョンであると簡単に結論付けることができます。たとえば、P0を無効にすると、最初のトランザクションがデータアイテムを書き込んだ後、2番目のトランザクションの書き込みが除外されます。これは、データアイテム(および述語)に対して長い書き込みロックを保持することと同じです。だから汚い書き込みは不可能です。同様に、P1を無効にすることは、適切な形式のデータ項目を読み取ることと同じです。 P2は、データ項目と長い読み取りロックを示すことは禁止されています。最後に、P3を無効にすることは、長い述語読み取りロックを保持することを意味します。したがって、これらの現象によって定義される表3の分離レベルは、表2のロック分離レベルと同じ動作を提供します。

結論6 :表2と表3のロック分離レベルは、現象の定義に基づいて同等です。つまり、P0、P1、P2、およびP3は、ロックバージョン分離レベルの再定義です。

次に、表3にリストされている分離レベルを表3の名前で参照します。これは、表2のこれらの分離レベルのロックバージョンに相当します。ANSIREADUNCOMMITTED、ANSI READ COMMITTED、ANSI REPEATABLEREADを参照する場合、およびANOMALY SERIALIZEDについては、表1のANSI定義を参照します(P0が含まれていないため、完全ではありません)。

次のセクションでは、多くの市販の分離実装が、読み取りコミット読み取りと反復可能読み取りの間にある分離レベルを提供することを示します。これらの実装を区別する意味のある分離レベルを実現するために、P0とP1をベースにして、新しい現象を追加します。

4.その他の隔離タイプ

4.1カーソルの安定性

カーソルの安定化は、更新の損失を防ぐように設計されています。

P4(失われた更新):トランザクションT1がデータ項目を読み取ると、T2はデータ項目を更新し(おそらく以前の読み取りに基づいて)、T1はデータ項目を更新してコミットします。更新の例外がありません。発生します。歴史の観点から、これは次のとおりです。

P4 :r1 [x] ... w2 [x] ... w1 [x] ... c1(更新が失われました)

(翻訳者注:P4はP0ダーティライトとP1ダーティリードに基づいていることに注意してください。ロック分離の観点からは、ショートリードロックとロングライトロックのみを保持します。ロックに達しない場合は、P2を繰り返し読み取ることができます(つまり、長くは保持されません)。ロックを読み取ります))

履歴H4が示すように、問題は、T2がコミットしても、T2の更新が失われることです。

H4:r1 [x = 100] r2 [x = 100] w2 [x = 120] c2 w1 [x = 130] c1

xの最終値は、T1によって書き込まれたx + 30 = 130です。 P0が無効(トランザクションが最初の書き込み操作を実行するデータ項目が別のトランザクションによって2回目に書き込まれる)またはP1(コミット前に読み取られる)の場合にH4が発生することが許可されるため、P4は少なくとも読み取りコミット分離レベルにあります。コミットされます)。もちろん、P2はr1 [x]、w2 [x]、(c1またはa1)であり、P4を含むため、P2を禁止するとP4も除外されます。したがって、P4は、コミットされた読み取りと繰り返し可能な読み取り強度を区別するための分離レベルとして使用できます。

カーソルは、読み取りコミット分離レベルでSQLカーソルのロック動作を着実に拡張します。カーソル上でフェッチ操作rcを提案します(カーソルを読み取ることを意味します)。 Rcでは、カーソルが移動または閉じられるまで(場合によってはコミットによって閉じられるまで)、カーソルの現在のデータ項目に対して長い読み取りロックが必要です。もちろん、カーソルのフェッチトランザクションは行(wc)を更新でき、カーソルが後続のフェッチ上に移動しても、トランザクションがコミットされるまで書き込みロックは行に残ります。 Rc1 [x]以降のwc1 [x]は、関連するw2 [x]を除外します。したがって、カーソル上の状況に対して、現象P4Cの現象が提案されます。

P4C :rc1 [x] ... w2 [x] ... w1 [x] ... c1(更新が失われました)

結論7 :提出済みを読む

カーソルの安定性は、カーソルによって読み取られた行の更新が失われるのを防ぐために、SQLシステムによって広く実装されています。一部のシステムでの読み取り値が送信されており、実際には、より強力なカーソルのみが安定しています。 ANSI規格では、これが許可されています。

値を安定させるためにデータ項目にカーソルを置く手法は、複数のカーソルを使用する代わりに、複数のデータ項目に使用できます。したがって、プログラマーは、少数の固定数のデータ項目にアクセスするために、アクセスの安定性を調整して、読み取りコミット済み分離をロックできます。ただし、この方法は不便であり、普遍的ではありません。したがって、カーソルの安定した分離レベルにあるP4(もちろんより一般的なP2の場合)現象の履歴が常にあります。

4.2スナップショットアイソレーション(SI)

スナップショットアイソレーションの下で実行されるトランザクションは、トランザクションの開始以降、常に(コミットされた)データのスナップショットからデータを読み取ります。トランザクションの開始時に取得されたタイムスタンプは、その開始タイムスタンプ(Start-Timestamp)と呼ばれます。このタイムスタンプは、トランザクションの最初の読み取りの前であればいつでもかまいません。トランザクションがスナップショット分離で実行される場合、その開始タイムスタンプに対応するスナップショットデータを維持できる限り、読み取りはブロックされません。トランザクションの書き込み(更新、挿入、および削除)もこのスナップショットに反映され、トランザクションが2回目にデータにアクセス(つまり、読み取りまたは更新)した場合、データを再度読み取ることができます。トランザクション開始タイムスタンプ後の他のトランザクションの更新は、このトランザクションには表示されません。

スナップショットアイソレーションは、マルチバージョン同時実行制御(MVCC)です。 [BHG]で説明されているMultiversionMixedMethodを拡張します。読み取り専用トランザクションを介してスナップショットを読み取ることができます。

トランザクションT1がコミットする準備ができると、既存のタイムスタンプよりも大きいコミットタイムスタンプ(Commit-Timestamp)を取得します。他のトランザクションT2によって送信されたデータのコミット時間がT1トランザクション[Start-Timestamp、Commit-Timestamp]の間隔内にある場合、T1、T2データのみがオーバーラップせず、トランザクションは正常に送信されます。それ以外の場合、T1は中止されます。この機能は、更新の損失を防ぐためにFirst-committer-winsと呼ばれます(P4)。 T1がコミットすると、その変更は、T1より大きいタイムスタンプでコミットタイムスタンプを開始するすべてのトランザクションに表示されます。

スナップショットアイソレーションはマルチバージョン(MV)方式であるため、単一値(SV)履歴は、時間の経過に伴う操作のシーケンスを正しく反映しません。各データ項目には、アクティブなトランザクションとコミットされたトランザクションによって書き込まれた複数のバージョンがあります。トランザクションは適切なバージョンを読み取る必要があります。セクション3から始まる履歴H1について考えてみます。これは、単一値の実行にはP1が必要であることを示しています。スナップショットアイソレーションでは、同じ一連の操作により、複数値の履歴が生成されます。

H1.SI:r1 [x0 = 50] w1 [x1 = 10] r2 [x0 = 50] r2 [y0 = 50] c2

r1 [y0 = 50] w1 [y1 = 90] c1

(翻訳者注:トランザクション1はx0 = 50を読み取り、x1 = 10を書き込みます。トランザクション2がx0の値を読み取る理由は、トランザクション1がまだコミットタイムスタンプを取得してx1を送信していないためです。したがって、トランザクション2の開始タイムスタンプは次のようになります。トランザクション1のコミットタイムスタンプの前。最後にダーティリードはありません)

ただし、H1.SIには、シリアル化できるデータストリームがあります。 [OOBBGM]では、データフローの依存関係を維持しながら、すべてのスナップショット分離履歴を単一値の履歴にマッピングできることを示しています(MV履歴はSV履歴ビューと同等と見なされ、変換方法は[BHG]第5章にあります) 。たとえば、MV履歴H1.SIは、シリアル化可能なSV履歴にマップされます。

H1.SI.SV:r1 [x = 50] r1 [y = 50] r2 [x = 50] r2 [y = 50] c2

w1 [x = 10] w1 [y = 90] c1

MV履歴をSV履歴にマッピングすることは、スナップショット分離を分離階層に配置するための鍵です。

トランザクションはある瞬間と別の瞬間に読み取られるため、スナップショットアイソレーションはシリアル化できません。たとえば、単一値の履歴について考えてみます。

H5:r1 [x = 50] r1 [y = 50] r2 [x = 50] r2 [y = 50] w1 [y = -40] w2 [x = -40] c1 c2

H5はシリアル化できず(翻訳者注:ただし、SIの読み取りおよび書き込みデータ項目セットが同じ場合はシリアル化できます)、スナップショットアイソレーション下のトランザクションと同じトランザクション間データフローを持ちます(トランザクション読み取りバージョンには選択の余地がありません)。ここでは、xとyに新しい値を書き込む各トランザクションに、x + y> 0を保持する制約があり、T1とT2の両方が分離されているため、制約をH5に残すことはできないと想定します。

制約違反は、一般的で重要なタイプの同時例外です。個々のデータベースは、複数のデータ項目に対する制約を満たします(たとえば、キーの一意性、参照整合性、2つのテーブルの行のレプリケーション関係など)。それらが一緒になって、データベース不変の制約述語C(DB)を形成します。データベース状態DBが制約と一致している場合、不変条件はTRUEであり、そうでない場合はFALSEです。トランザクションは、一貫性を維持するために制約述語を保持する必要があります。トランザクションの開始時にデータベースに一貫性がある場合、トランザクションがコミットするときにデータベースに一貫性があります。トランザクションが制約述語に違反するデータベース状態を読み取る場合、トランザクションは並行例外に違反するように制約されます。この制約違反は、[DAT]では不整合分析と呼ばれます。

A5 (データ項目制約違反)。 C()が、データベース内の2つのデータ項目xとyの間のデータベース制約であるとします。制約違反によって引き起こされる2種類の異常を次に示します。

A5A Read Skewは、トランザクションT1がxを読み取ると想定し、次に2番目のトランザクションT2がxとyを更新してコミットします。 T1がyを読み取る場合、一貫性のない状態が表示される可能性があります。歴史に関する限り、例外があります。

A5A :r1 [x] ... w2 [x] ... w2 [y] ... c2 ... r1 [y] ...(c1またはa1)(読み取りバイアス)

A5B Write Skewは、T1がC()と一致するxとyを読み取り、次にT2がxとyを読み取り、xを書き込み、コミットすると想定します。次に、T1はyを書き込みます。 xとyの間に制約がある場合は、違反している可能性があります。歴史の観点から:

A5B :r1 [x] ... r2 [y] ... w1 [y] ... w2 [x] ...(c1とc2が発生)(書き込みバイアス)

ファジー読み取り(P2)は、読み取りバイアスの縮退形式です。ここで、x = yです。より一般的には、トランザクションは2つの異なるが関連する項目(参照整合性など)を読み取ります。書き込みバイアス(A5B)は、銀行のセマンティクスの制約に起因する可能性があります。たとえば、保有残高の合計が負でない限り、口座残高が負になる可能性があります。歴史H5の異常など。

P2を除外した履歴では、A5AとA5Bの両方に、T2が以前にT1によってコミットされていないデータ項目を書き込む場合があるため、A5AもA5Bも発生しません。したがって、現象A5AおよびA5Bは、繰り返し可能な読み取りより下の分離レベルを区別するためにのみ使用されます。

ANSI SQL定義での繰り返し可能な読み取りは、厳密な解釈で行制約の縮退形式をキャプチャしますが、概念的に欠落しています。特に、表2のロック反復可能読み取りは、行制約違反に対する保護を提供しますが、表1のANSI SQL定義は、例外A1およびA2のみを禁止し、行制約違反に対する保護を提供しません。

スナップショット分離に戻ると、この分離レベルは非常に強力であり、読み取りコミットよりも強力です。

結論8 :提出済みを読む

証明する :スナップショットアイソレーションでは、first-committer-winsがP0(ダーティライト)を除外し、タイムスタンプメカニズムがP1(ダーティリード)をブロックするため、スナップショットアイソレーションは読み取りコミットよりも弱くはありません。さらに、A5Aは読み取りコミットの下にある可能性がありますが、スナップショットアイソレーションおよびタイムスタンプメカニズムの下にはありません。したがって、読み取りが送信されました

単一値の解釈では、スナップショット分離履歴がP2にどのように違反しているかを説明するのは難しいことに注意してください。スナップショットアイソレーション下のトランザクションは、別のトランザクションがデータアイテムを更新した後でも、同じバージョンのデータアイテムの値のみを読み取るため、例外A2は発生しません。ただし、部分書き込み(A5B)は明らかにスナップショットアイソレーション(H5など)で発生し、単一値の履歴の説明で、P2を禁止するとA5Bも除外されることが記載されています。したがって、スナップショットアイソレーションは、繰り返し可能な読み取りに履歴例外がないことを認識します。

スナップショットアイソレーションでは、A3例外(ファントム読み取り)は発生しません。トランザクションがデータ項目セットを更新すると、複数の述語読み取りがある別のトランザクションには、常に同じ古いデータ項目セットが表示されます。ただし、繰り返し可能な読み取り分離レベルでは、A3例外が発生する場合があります。スナップショットアイソレーションは例外A3の履歴を無効にしますが、A5Bを許可しますが、繰り返し可能な読み取りはその逆を行います(A3がA5Bを無効にすることを許可します)。したがって:

結論9 :繰り返し読む>

ただし、スナップショットアイソレーション(A3を除く)はP3を排除しません(述語読み取りトランザクションは、述語スコープ内の別のトランザクションによって書き込まれます)。述部によって決定された一連のジョブタスクが8時間を超えることはできないことを示す制約について考えてみます。 T1はこの述語を読み取り、合計がわずか7時間であると判断し、1時間の期間で新しいタスクを追加しますが、並行トランザクションT2は同じことを行います。 2つのトランザクションが異なるデータ項目(および存在する場合は異なるインデックスエントリ)を挿入しているため、First-Committer-Winsはこれを除外せず、スナップショットアイソレーションで発生する可能性があります。ただし、同等のシリアル履歴では、この場合P3が発生します。

おそらく最も印象的なのは、スナップショットアイソレーションにファントム読み取りがないことです(厳密な意味でANSI定義A3)。すべてのトランザクションで、同時トランザクションの更新が表示されるわけではありません。したがって、[ANSI]の4.28で追加の制限なしに、次の驚くべき結果を言うことができます(表1は、ANSISQLで定義されているようにANOMALYSERIALIZABLEをSERIALIZABLEとして定義していることに注意してください)。

結論10 :スナップショットアイソレーション履歴は、例外A1、A2、およびA3を除外します。したがって、表1の例外解釈では、例外的なシリアル化可能:シリアル化可能

スナップショットアイソレーションにより、トランザクションを非常に古いタイムスタンプで実行できるため、データベースの履歴から「タイムトラベル」が可能になります。プロセス中に書き込みがブロックされることはありません。もちろん、タイムスタンプが非常に古いトランザクションは、新しいトランザクションによって更新されたデータ項目を更新しようとすると中止されます。

スナップショットアイソレーションの単純な実装は、Reed [REE]を模倣しています。このマルチバージョンデータベースには、いくつかの商用実装があります。 BorlandのInterBase4 [THA]とMicrosoftExchangeベースのエンジンはどちらも、スナップショットアイソレーションとFirst-committer-wins機能を提供します。 First-Committer-winsでは、アクティブな各トランザクションの開始タイムスタンプの後にコミットされたトランザクションのすべての更新(ロック情報の書き込み)をシステムが記憶する必要があります。更新がシステムメモリ内の他の誰かによる既存の更新と競合する場合、トランザクションは中止されます。

スナップショットアイソレーションの「楽観的」同時実行制御方法には、読み取り専用トランザクションに対して明らかな同時実行の利点がありますが、更新トランザクションに対するその利点についてはまだ議論の余地があります。これは、長時間実行されるトランザクションがすべての書き込みの最初の作成者になる可能性が低く、したがって中止される可能性があるため、長時間実行され、競争の激しい短いトランザクションの実行に悪影響を与える可能性があります。 (この状況は、ロックの実装でも実際の問題になる可能性があることに注意してください。ソリューションが短いトランザクションロックを保持する長時間実行の更新を許可しない場合、スナップショットアイソレーションは許容されます。)もちろん、短期間の更新トランザクションの競合は最小化。長時間実行されるトランザクションがほとんど読み取り専用トランザクションである場合、スナップショットアイソレーションは良い効果をもたらすはずです。データの衝突が多い長いトランザクションでは、スナップショットアイソレーションは古典的に楽観的なアプローチを提供します。この場合、スナップショットアイソレーションの価値については異なる認識があります。

4.3その他のマルチバージョンシステム

他のモード用のマルチバージョン同時実行制御もあります。一部の商用データベースはオブジェクトのバージョンを維持しますが、スナップショット分離を読み取り専用トランザクションに制限します(たとえば、SQL-92、Rdb、および他の一部のデータベースの[MS、HOB、ORA]のSET TRANSACTION READ PostgresおよびIllustra [STO、ILL ]複数のバージョンを長期間維持し、「タイムトラベル」クエリを提供します)。他の製品は更新トランザクションを許可しますが、最初のコミッターの勝利を保証するものではありません(たとえば、Oracle Read Consistency Isolation [ORA])。

Oracle Read Consistency分離は、各SQLステートメントの開始後のトランザクション開始タイムスタンプに基づいて、最後にコミットされたデータベース値を提供します。これは、トランザクションの開始タイムスタンプがすべてのSQLステートメントの最新のものであるかのようです。カーソルが開始される時刻は、カーソルセットのメンバーです。基礎となるメカニズムは、ステートメントのタイムスタンプに基づいて行の適切なバージョンを再計算します。書き込みロックは、行の挿入、更新、および削除を保護して、first-committer-winsポリシーではなくfirst-writer-winsを提供します。読み取りの整合性は、コミットされた読み取りよりも強力です(カーソル損失の更新(P4C)を禁止します)が、繰り返し不可能な読み取り(P3)、更新の損失(P4)、および読み取りオフセット(A5A)を許可します。スナップショットアイソレーションでは、P4またはA5Aは許可されません。

SQL標準をよく見ると、各ステートメントがアトミック操作として定義されています。各ステートメントの先頭に、シリアル化可能なサブトランザクション(またはタイムスタンプ)があります。ステートメントにタイムスタンプを割り当てることによって分離レベルを定義する分離レベル階層を想像することができます(たとえば、Oracleでは、カーソルフェッチの開始タイムスタンプがあります)。

5.まとめ

要約すると、元のANSI SQL分離レベルの定義には重大な問題があります(セクション3で説明)。英語のテキストでの定義は曖昧で不完全です。ダーティ書き込み(P0)は除外されません。結論5は、ロック分離レベル[GLPT]に対応するようにANSI分離レベルをクリーニングすることをお勧めします。

ANSI SQLは、ファントム読み取りを除くすべての例外を除外するために、繰り返し可能な読み取り分離を定義したいと考えています。表1の例外定義はこの目標を達成しませんでしたが、表2のロックバージョン定義は達成しました。 ANSIによる「繰り返し可能な読み取り」という用語の選択は非常に不適切です。(1)繰り返し可能な読み取りは繰り返し可能な結果を​​生成せず、(2)業界はこの用語を使用して、繰り返し可能な読み取りはシリアル化可能を意味します。これはいくつかの製品用語で考慮されています。このための別の用語を見つけることをお勧めします。

多くの商用製品で普及している分離レベルは、表3の繰り返し読み取りとシリアル化の間にあります。セクション4で説明します。ここで指定するすべての分離レベルは、次のように図2と表4に示すように特徴付けられています。図2の分離レベルが高いほど、強度が高くなり(セクション4.1の冒頭の定義を参照)、接続線には、それらを区別する現象と異常が示されます。

マルチバージョンシステムの分離レベルを下げることについて説明している記事は、すでにいくつかの製品に実装されていますが、これまで一度もなかったことは注目に値します。多くのアプリケーションは、カーソルの安定性またはOracleの一貫した分離を使用して、ロックの競合を回避します。このようなアプリケーションでは、スナップショットアイソレーションが両方よりも優れていることがわかります。つまり、更新例外の欠落と、一部のファントム読み取り例外(ANSI SQLで定義されている)を回避します。読み取り専用トランザクションをブロックせず、読み取りは更新をブロックしません。

声明をありがとう(省略)

参照

[ANSI] ANSI X3.135-1992、情報システムの米国規格—データベース言語— SQL、1992年11月

[ABJ] V. Atluri、E。Bertino、S。Jajodia、「データベースにおける分離度の理論的定式化」、テクニカルレポート、ジョージメイソン大学、バージニア州フェアファックス、1995年

[BHG] P. A. Bernstein、V。Hadzilacos、N。Goodman、「データベースシステムにおける同時実行制御と回復」、Addison-Wesley1987。

[DAT] C. J. Date、「An Introduction to Database Systems」、第5版、Addison-Wesley、1990 [DB2] C. J.DateおよびC.J. White、「A Guide to DB2」、第3版、Addison-Wesley、1989。

[EGLT] K. P. Eswaran、J。Gray、R。Lorie、I。Traiger、「データベースシステムにおける一貫性と述語ロックの概念」、CACM V19.11、pp。624-633、1978年11月

[GLPT] J. Gray、R。Lorie、G。Putzolu、およびI. Traiger、「共有データベースにおけるロックの粒度と一貫性の程度」、データベースシステムの読み取り、第2版、第3章、Michael Stonebraker、 Ed。、Morgan Kaufmann 1994(元々は1977年に発行されました)。

[GR] J.GrayおよびA.Reuter、「トランザクション処理:概念と技法」、修正された2番目の印刷、Morgan Kaufmann 1993、セクション7.6以降。

[HOB] L。 Hobbs and K. England、「Rdb / VMS、A Comprehensive Guide」、Digital Press、1991年。

[ILL] Illustra Information Technologies、「Illustra User's Guide」、Illustra Information Technologies、カリフォルニア州オークランド。 1994年。

[MS] J.MeltonおよびA.R. Simon、「Understanding the New SQL:A Complete Guide」、Morgan Kaufmann1993。

[OOBBGM] P. O'Neil、E。O'Neil、H。Berenson、P。Bernstein、J。Gray、J。Melton、「トランザクション分離レベルの調査」、UMass / Boston Dept. of Math&CS Preprint 。

[ORA]「PL / SQLユーザーズ・ガイドおよびリファレンス、バージョン1.0」、パート。 800-V1.0、Oracle Corp.、1989。

[PAP] C. Papadimitriou、「データベース同時実行制御の理論、コンピュータサイエンスプレス、1986年。

[PON] P. O’Neil、「データベース:原則、プログラミング、パフォーマンス、Morgan Kaufmann 1994、セクション9.5。

[REE] D. Reed、「分散データに対するアトミックアクションの実装」、ACM TOCS 1.1、1981、pp。3-23。

[STO] M. J. Stonebraker、「The Design of the POSTGRES Storage System」、第13 VLDB、1987年、Readings in Database Systems、第2版、M。J。Stonebraker編、Morgan Kaufmann 1994

[THA] M. Thakur、「InterBase 4のトランザクションモデル」、ボーランド国際会議の議事録、1994年6月。