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

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ SQL の使用法 » トランザクションと独立性レベル

 

独立性レベルと一貫性

SQL Anywhere では、あるトランザクションの操作が、同時に実行される他のトランザクションの操作で認識される程度を制御できます。この制御には、「独立性レベル」というデータベースオプションを使用します。

また、対応するテーブルヒントを使用して、クエリ内の個々のテーブルの独立性レベルを制御することもできます。

SQL Anywhere が提供するインタフェースを次に示します。

独立性レベル 特性
0 - コミットされない読み出し
  • 書き込みロックの有無にかかわらず、ローで読み込みが許可される。

  • 読み込みロックは適用されない。

  • 同時トランザクションがローを変更しないこと、またはローに対しての変更がロールバックされないことは保証されない。

  • テーブルヒント NOLOCK と READUNCOMMITTED に対応する。

  • ダーティリード、繰り返し不可能読み出し、幻ローを許可する。

1 - コミットされた読み出し
  • 書き込みロックのないローでは読み込みのみ許可される。

  • 現在のローでの読み込みに対してのみ読み込みロックが取得されて保持されるが、カーソルがローから移動すると解放される。

  • トランザクション中にデータが変更されないという保証はない。

  • テーブルヒント READCOMMITTED に対応する。

  • ダーティリードを防ぐ。

  • 繰り返し不可能読み出しと幻ローを許可する。

2 - 繰り返し可能読み出し
  • 書き込みロックのないローでは読み込みのみ許可される。

  • 結果セットの各ローとして取得された読み込みロックが読み込まれ、トランザクションが終了するまで保持される。

  • テーブルヒント REPEATABLEREAD に対応する。

  • ダーティリードと繰り返し不可能読み出しを防ぐ。

  • 幻ローを許可する。

3 - 直列化可能
  • 書き込みロックのない結果内のローに対しては読み込みのみ許可される。

  • カーソルが開いているときに取得された読み込みロックは、トランザクションの終了時まで保持される。

  • テーブルヒント HOLDLOCK と SERIALIZABLE に対応する。

  • ダーティリード、繰り返し不可能読み出し、幻ローを防ぐ。

snapshot 1
  • 読み込みロックは適用されない。

  • すべてのローで読み込みが許可される。

  • コミットされたデータのデータベーススナップショットは、トランザクションが最初のローの読み込みまたは更新を行った時点で作成される。

statement-snapshot1
  • 読み込みロックは適用されない。

  • すべてのローで読み込みが許可される。

  • コミットされたデータのデータベーススナップショットは、文が最初のローの読み込みを行った時点で作成される。

readonly-statement-snapshot1
  • 読み込みロックは適用されない。

  • すべてのローで読み込みが許可される。

  • コミットされたデータのデータベーススナップショットは、読み込み専用の文が最初のローの読み込みを行った時点で作成される。

  • 更新可能な文の updatable_statement_isolation オプションで指定された独立性レベル (0、1、2、または 3) を使用する。

1 データベースで allow_snapshot_isolation が On に設定され、そのデータベースでスナップショットアイソレーションが有効である必要があります。

デフォルトの独立性レベルは 0 です。ただし、Open Client、jConnect、TDS の各接続におけるデフォルトの独立性レベルは 1 です。

ロックベースの独立性レベルは、一部またはすべての干渉を防ぎます。レベル 3 は最も高いレベルの独立性を提供します。2 以下のレベルでは、一貫性のレベルは低くなりますが、パフォーマンスは一般にレベル 3 より高くなります。デフォルトでは、レベルは 0 (コミットされない読み出し) に設定されています。

スナップショットアイソレーションのレベルは、読み込みと書き込み間の干渉を防ぎます。書き込みは相互に干渉する可能性があります。一貫性のない動作が多少生じる可能性がありますが、競合のパフォーマンスは独立性レベルを 0 に設定した場合と同じです。ローバージョンを保存して使用する必要があるため、競合以外のパフォーマンスは低下します。

一般的に、各独立性レベルは、必要なロックの種類や、他のトランザクションが保持するロックをどのように扱うかによって特徴づけられます。独立性レベルが 0 の場合、データベースサーバは書き込みロックだけを必要とします。データベースサーバは、これらのロックを使用して、2 つのトランザクションが競合する修正を行わないようにします。たとえば、レベル 0 のトランザクションは、ローの更新や削除をする前に書き込みロックをかけ、すでに書き込みロックがかかっている新しいローを挿入します。

レベル 0 のトランザクションは、読み込み中のローはチェックしません。たとえば、レベル 0 のトランザクションがローを読み込むときは、他のトランザクションがそのローにどのようなロックをかけているかをチェックしません。チェックが不要のため、レベル 0 のトランザクション処理は速くなります。この速度は一貫性を犠牲にして得られたものです。別のトランザクションが書き込みロックをかけているローを読むと、ダーティデータを返す危険性があります。レベル 1 では、トランザクションはローを読む前に書き込みロックがかかっていないかをチェックします。操作は 1 つ増えますが、このトランザクションでは読み込むデータはすべてコミット済みであることが保証されます。

注意

どの独立性レベルにおいても、各トランザクションが完全に実行されるかまったく実行されないこと、および更新内容が失われないことが保証されます。

独立性レベルはトランザクション間にのみ当てはまります。同じトランザクション内の複数のカーソルが相互に干渉することはありません。

 参照

スナップショットアイソレーション
典型的な矛盾のケース
独立性レベルの設定方法
ODBC 実行可能アプリケーションでの独立性レベル
独立性レベルの参照