Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » トランザクションと独立性レベルの使用 » 独立性レベルと一貫性

 

典型的な矛盾のケース

トランザクションの同時実行中に発生する可能性のある典型的な矛盾には 3 つのタイプがあります。(他のタイプの矛盾も発生し得るため、この 3 つがすべてというわけではありません)。これら 3 つのケースは、ISO SQL/2003 標準に記載されており、重要なものです。独立性レベルの低い動作を定義する際の基準となるものだからです。

  • ダーティ・リード   トランザクション A がローを修正し、変更のコミットもロールバックもしないとします。その修正がコミットまたはロールバックされる前に、トランザクション B がそのローを読みます。その後、COMMIT が実行される前に、トランザクション A がさらにそのローを変更するか、またはその修正をロールバックしたとします。いずれの場合も、トランザクション B はコミットされなかった状態でローを読んでしまったことになります。

    ダーティ・リードの詳細については、チュートリアル:ダーティ・リードを参照してください。

  • 繰り返し不可能読み出し   トランザクション A がローを読みます。次にトランザクション B がそのローを修正または削除して、COMMIT を実行します。トランザクション A がもう一度そのローを読もうとしたときには、ローは修正されているか、削除されてしまっています。

    繰り返し不能読み出しの詳細については、チュートリアル:繰り返し不可能読み出しを参照してください。

  • 幻ロー   トランザクション A が、一定の条件を満たすローのセットを読みます。次に、トランザクション B は、前にトランザクション A の条件を満たさなかったローで INSERT または UPDATE を実行します。トランザクション B はこれらの変更をコミットします。新しくコミットされたローはトランザクション A の条件を満たします。トランザクション A がもう一度データを読み込むと、更新されたローのセットを取得します。

    幻ローの詳細については、チュートリアル:幻ローを参照してください。

独立性レベルとダーティ・リード、繰り返し不可能読み出し、幻ロー

SQL Anywhere では、使用する独立性レベルに応じて、ダーティ・リード、繰り返し不可能読み出し、幻ローを許可します。次の表で X は、その動作がその独立性レベルで許可されていることを表します。

独立性レベル ダーティ・リード 繰り返し不可能読み出し 幻ロー
0 - コミットされない読み出し X X X
readonly-statement-snapshot X1 X2 X3
1 - コミットされた読み出し X X
statement-snapshot X2 X3
2 - 繰り返し可能読み出し X
3 - 直列化可能
snapshot

1 ダーティ・リードは、updatable_statement_isolation オプションで指定された独立性レベルがその発生を妨げない場合に、トランザクション内の更新可能な文で発生することがあります。

2 繰り返し不可能読み出しは、updatable_statement_isolation オプションで指定された独立性レベルがその発生を妨げない場合に、トランザクション内の文で発生することがあります。繰り返し不可能読み出しは、各文によって新しいスナップショットが開始する場合に発生することがあります。そのため、ある文が認識しない変更を別の文が認識する可能性があります。

3 幻ローは、updatable_statement_isolation オプションで指定された独立性レベルがその発生を妨げない場合に、トランザクション内の文で発生することがあります。幻ローは、各文によって新しいスナップショットが開始する場合に発生することがあります。そのため、ある文が認識しない変更を別の文が認識する可能性があります。

この表から、以下の 2 つのことがわかります。

  • 各独立性レベルは、3 つの典型的な矛盾のケースのうち 1 つを防止します。

  • 各レベルは、それ以下のレベルで防止される矛盾のケースも防止します。

  • statement snapshot 独立性レベルでは、繰り返し不可能読み出しと幻ローは、トランザクション内で発生する可能性がありますが、トランザクションの単一文内では発生しません。

ODBC では、独立性レベルに異なる名前が付いています。これらの名前は、それぞれのレベルで防止される矛盾の名前に基づいて付けられています。ValuePtr パラメータを参照してください。


カーソル不安定性