ローロックのほかに、SQL Anywhere では幻または幻ローが存在するための異常事態を避けるために設計された、キー範囲のロック形式である位置ロックを実装しています。位置ロックが関係するのは、独立性レベル 3 で実行しているトランザクションをデータベースサーバが処理しているときです。
独立性レベル 3 で実行しているトランザクションは直列化可能です。独立性レベル 3 のトランザクションの動作は、他のトランザクションによって同時に発生する更新アクティビティの影響を受けないはずです。実際に独立性レベル 3 のトランザクションは、計算結果に影響を与える可能性のあるローが取り込まれる INSERT または UPDATE (つまり幻) による影響を受けることはありません。SQL Anywhere では位置ロックを使用して、そのような更新が発生することを防ぎます。位置ロックは、独立性レベル 2 (繰り返し可能読み出し) と独立性レベル 3 とを区別する追加のロック処理です。
幻ローが作成されないように、テーブルの物理スキャン内で位置のロックが取得されます。逐次スキャンの場合は、現在のローのロー識別子に基づいてスキャン位置が決定されます。インデックススキャンの場合は、現在のローのインデックスキー値に基づいてスキャン位置が決定されます (インデックスキー値は、ユニークな場合もそうでない場合もある)。トランザクションはスキャン位置をロックすることによって、他のトランザクションが、ローの順序付けに使用される特定範囲の値に関する挿入を行うことを防ぐことができます。この動作は、INSERT 文やインデックス付き属性の値を変更する UPDATE 文に適用されます。スキャン位置がロックされた場合、UPDATE 文は、直後に INSERT 要求が続く、インデックスエントリに対する DELETE 要求であると見なされます。
SQL Anywhere でサポートされる位置ロックには、幻ロックと挿入の 2 種類があります。どちらの種類も共有ロックであり、複数のトランザクションが同じローで同じ種類のロックを取得できます。ただし、幻ロックと対幻ロックは競合します。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |