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 で実行しているトランザクションをデータベースサーバーが処理しているときだけです。

独立性レベル 3 で実行されるトランザクションは、直列化可能であるとされています。つまり、独立性レベル 3 のトランザクションの動作は、他のトランザクションによって同時に実行される更新アクティビティの影響を受けてはならないということです。実際に独立性レベル 3 のトランザクションは、計算結果に影響を与える可能性のあるローが取り込まれる INSERT または UPDATE (つまり幻) による影響を受けることはありません。SQL Anywhere では位置ロックを使用して、そのような更新が発生することを防ぎます。位置ロックは、独立性レベル 2 (繰り返し可能読み出し) と独立性レベル 3 とを区別する追加のロック処理です。

幻ローが作成されないように、テーブルの物理スキャン内で位置のロックが取得されます。逐次スキャンの場合は、現在のローのロー識別子に基づいてスキャン位置が決定されます。インデックススキャンの場合は、現在のローのインデックスキー値に基づいてスキャン位置が決定されます (インデックスキー値は、ユニークな場合もそうでない場合もある)。トランザクションはスキャン位置をロックすることによって、他のトランザクションが、ローの順序付けに使用される特定範囲の値に関する挿入を行うことを防ぐことができます。これには、INSERT 文やインデックス付き属性の値を変更する UPDATE 文も含まれます。スキャン位置がロックされた場合、UPDATE 文は、直後に INSERT 要求が続く、インデックスエントリに対する DELETE 要求であると見なされます。

SQL Anywhere でサポートされる位置ロックには、幻ロックと対幻ロックの 2 種類があります。どちらの種類も共有ロックであり、複数のトランザクションが同じローで同じ種類のロックを取得できます。ただし、幻ロックと対幻ロックは競合します。


幻ロック
挿入ロック