1 つのトランザクションの中の異なる部分に、別々の独立性レベルを設定したい場合、SQL Anywhere では、使用しているデータベースの独立性レベルをトランザクション中に変更できます。
トランザクション中に isolation_level オプションを変更すると、新しい設定は次の項目だけに反映されます。
変更後に表示されたカーソル
変更後に実行された文
トランザクションの途中で独立性レベルを変更し、トランザクションが実施するロック数を制御する必要がある場合があります。トランザクションで大きなテーブルを読み込む必要があるが、詳細な作業をするのは一部のローだけという場合もあります。矛盾が生じてもトランザクションには重大な影響を及ぼさない場合は、その大きなテーブルをスキャンする間は独立性レベルを低レベルに設定し、他の処理が遅れないようにしてください。
たとえば、1 つのテーブルまたはテーブル・グループだけがシリアル・アクセスを要求している場合などは、トランザクション中に独立性レベルを変更できます。
トランザクション中に独立性レベルを変更する例については、チュートリアル:幻ローを参照してください。
テーブル・ヒントを使用して独立性レベルを設定することもできますが (レベル 0 ~ -3 のみ)、これは高度な機能であるため必要な場合にのみ使用してください。詳細については、FROM 句の WITH テーブル・ヒントに関する項を参照してください。
スナップショット・アイソレーションを使用するときは、トランザクション内で独立性レベルを変更できます。これを行うには、isolation_level オプションの設定を変更するか、クエリ内の独立性レベルに影響するテーブル・ヒントを使用します。いつでも statement-snapshot、readonly-statement-snapshot、独立性レベル 0 ~ 3 を使用できます。ただし、snapshot 以外の独立性レベルでトランザクションを開始した場合は、そのトランザクションで snapshot 独立性レベルを使用できません。トランザクションは、更新によって開始され、次の COMMIT または ROLLBACK まで続行します。最初の更新が snapshot 以外の独立性レベルで開始した場合、トランザクションがコミットかロールバックする前に snapshot 独立性レベルを使用しようとする文を実行すると、エラー -1065 NON_SNAPSHOT_TRANSACTION を返します。次に例を示します。
SET OPTION PUBLIC.allow_snapshot_isolation = 'On'; BEGIN TRANSACTION SET OPTION isolation_level = 3; INSERT INTO Departments ( DepartmentID, DepartmentName, DepartmentHeadID ) VALUES( 700, 'Foreign Sales', 129 ); SET TEMPORARY OPTION isolation_level = 'snapshot'; SELECT * FROM Departments; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |