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

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

 

スナップショットアイソレーション

複数のユーザーが同じデータに対して同時に読み込みと書き込みを行うと、ブロックやデッドロックが発生することがあります。スナップショットアイソレーションは、さまざまなバージョンのデータを管理することにより同時実行性と一貫性を向上させる目的で設計されています。トランザクションでスナップショットアイソレーションを使用すると、データベースサーバーは読み込み要求の応答としてコミットされたバージョンのデータを返します。これは読み込みロックを取得せずに行われるため、データを書き込んでいるユーザーとの干渉は発生しません。

「スナップショット」とは、データベースでコミットされた一連のデータです。スナップショットアイソレーションを使用すると、トランザクション内のすべてのクエリで同じデータのセットが使用されます。データベースのテーブルでロックは取得されません。これにより、他のトランザクションはブロックせずにアクセスして修正できます。SQL Anywhere では、スナップショットを作成するときに制御できる 3 つのスナップショットアイソレーションのレベルをサポートしています。

  • snapshot   トランザクションが最初のローの読み込み、挿入、更新、または削除を行った時点から、コミットされたデータのスナップショットを使用します。

  • statement-snapshot   文で最初のローが読み込まれた時点から、コミットされたデータのスナップショットを使用します。トランザクション内の各文で参照されるデータのスナップショットはそれぞれ異なる時点のものになります。

  • readonly-statement-snapshot   読み込み専用の文についてのみ、最初のローが読み込まれた時点から、コミットされたデータのスナップショットを使用します。トランザクション内の各読み込み専用文で参照されるデータのスナップショットはそれぞれ異なる時点のものになります。挿入、更新、削除の文については、updatable_statement_isolation オプションに指定された独立性レベル (0 (デフォルト)、1、2、3 のいずれか) を使用します。

BEGIN SNAPSHOT 文を使用して、トランザクションのスナップショットの開始時に指定するオプションもあります。

スナップショットアイソレーションは、主に次のような場合に便利です。

  • 読み込みは多いが更新は少ないアプリケーション   スナップショットトランザクションは、データベースを修正する文の場合のみ、書き込みロックを取得します。トランザクションが主に読み込み操作を実行する場合、スナップショットトランザクションは、他のユーザーと干渉する可能性のある読み込みロックを取得しません。

  • 他のユーザーがデータにアクセスする必要があるにもかかわらず、時間がかかるトランザクションを実行するアプリケーション   スナップショットトランザクションは読み込みロックを取得しないため、他のユーザーはスナップショットトランザクションの実行中にデータの読み込みや更新を実行できます。

  • データベースからの一貫したデータのセットを読み取る必要があるアプリケーション   スナップショットはある時点からのコミット済みデータのセットを表示するため、トランザクションの実行中に他のユーザーが変更を加えた場合でも、スナップショットアイソレーションを使用すれば、そのトランザクション内では変更されない一貫したデータを確認できます。

スナップショットアイソレーションは、すべてのユーザーが共有するベーステーブルとグローバルテンポラリテーブルのみに影響します。その他のテーブルの種類では読み込み操作を行っても、古いバージョンのデータは表示されず、スナップショットは開始されません。別のテーブルの種類に対する更新によってスナップショットが開始されるのは、isolation_level オプションが snapshot に設定されていて、更新によりトランザクションが開始される場合だけです。

文またはトランザクションのスナップショットを使用する、WITH HOLD 句を使用して開かれたカーソルがある場合、次の文は実行できません。

WITH HOLD 句でカーソルを開くと、スナップショットの開始時にコミットされたすべてのローのスナップショットが表示されます。カーソルを開いたトランザクションの開始以降の、現在の接続で完了された変更もすべて表示されます。

高速トランケーションが実行されない場合にのみ、TRUNCATE TABLE を使用できます。これは、このような場合に個別の DELETE がトランザクションログに記録されるためです。

また、これらの文のいずれかをスナップショットでないトランザクションから実行した場合、すでに実行中のスナップショットトランザクションで、それ以降にテーブルを使用しようとすると、スキーマが変更されたことを示すエラーが返されます。

トランザクションのスナップショットが開始された後でビューがリフレッシュされた場合、マテリアライズドビューマッチングではそのビューは使用されません。

スナップショットアイソレーションのレベルは、すべてのプログラミングインターフェイスでサポートされています。スナップショットアイソレーションのレベルは SET OPTION 文を使用して設定できます。スナップショットアイソレーションの使用については、次の項を参照してください。

 ローバージョン
 スナップショットトランザクションの知識
 参照

スナップショットアイソレーションの有効化
スナップショットアイソレーションの例
更新の競合とスナップショットアイソレーション