トランザクションがローを読み込むと、トランザクションのアイソレーション・レベルは読み込みロックが取得されているかどうかを判断します。一度読み込みロックのかかったローに対しては、他のどのトランザクションも書き込みロックを取得できません。読み込みロックが取得されると、ローの読み込み中は、別のトランザクションはそのローを修正または削除しません。任意のローに同時に取得できる読み込みロックの数に制限はありません。そのため、読み込みロックは、共有ロックまたは非排他ロックと呼ばれることもあります。
読み込みロックは、保持される期間が異なることがあります。独立性レベル 2 と 3 では、トランザクションが取得したどの読み込みロックも、トランザクションが COMMIT または ROLLBACK によって完了するまで保持されます。これらの読み込みロックは、長期間の読み込みロックと呼ばれます。
独立性レベル 1 で実行されるトランザクションの場合、データベース・サーバはカーソルが位置するローで短期間の読み込みロックを取得します。アプリケーションがカーソルをスクロールすると、カーソルが直前に位置していたローで短期間の読み込みロックは解放され、新しい短期間の読み込みロックがその次のローで取得されます。この技術は「カーソルの安定性」と呼ばれます。アプリケーションは現在のローで読み込みロックを保持するため、アプリケーションがそのローからカーソルを移動するまで、別のトランザクションがそのローに対して変更を加えることができません。カーソルが複数のテーブルを伴うクエリに対する場合は、複数のロックを取得できます。短期間の読み込みロックは、カーソル内の位置が要求 (通常は、アプリケーションによって発行される FETCH 文) 間で維持される必要がある場合だけ取得されます。たとえば SELECT COUNT(*) クエリの処理時は短期間の読み込みロックは取得されません。この文で開かれているカーソルが、ベース・テーブルの特定ローに位置することがないためです。この場合、データベース・サーバは、コミットされた読み出しのセマンティック、つまりこの文で処理されるローは他のトランザクションによってコミットされたことを保証すれば良いことになります。
独立性レベル 0 (コミットされない読み出し) で実行されるトランザクションの場合は、長期間または短期間の読み込みロックを取得しないため、他のトランザクションと競合しません (排他スキーマ・ロックの場合を除く)。ただし、独立性レベル 0 のトランザクションは、同時に実行している他のトランザクションによって加えられたコミットされていない変更を処理することがあります。コミットされていない変更を処理しないようにするには、スナップショット・アイソレーションを使用します。スナップショット・アイソレーションを参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |