幻ロックは対挿入ロックとも呼ばれ、その後で他のトランザクションによって幻ローが作成されないように、スキャン位置に設定されます。幻ロックが取得されると、テーブル内で、対挿入ロックがかかっているローの直前に、他のトランザクションがローを挿入することを防止します。幻ロックは長期間のロックで、トランザクションの終了まで保持されます。
幻ロックは、独立性レベル 3 で実行しているトランザクションのみが取得できます。独立性レベル 3 は、幻に関して一貫性を保証する唯一の独立性レベルです。
インデックス・スキャンでは、幻ロックはインデックスを介して読み込まれる各ローで取得されます。また、条件を満たすインデックス範囲の最後にインデックスが挿入されることを防ぐため、インデックス・スキャンの最後に幻ロックが 1 つ追加取得されます。インデックス・スキャンで幻ロックを使用すると、テーブルに新しいローが挿入されたり、インデックス付きの値 (幻ロックの対象となるポイントにインデックス・エントリが作成される原因となる) が更新されたりすることが原因で、幻が作成されないようになります。
逐次スキャンでは、挿入処理によって結果セットが変更されないように、幻ロックはテーブルの行ごとに取得されます。このため、独立性レベル 3 のスキャンにより、データベースの同時実行性が悪影響を受けることがあります。1 つ以上の幻ロックは挿入ロックと競合し、1 つ以上の読み込みロックは書き込みロックと競合しますが、幻ロック/挿入ロックと読み込みロック/書き込みロックの間に相互作用はありません。たとえば、書き込みロックは読み込みロックのかかったローにかけることはできませんが、幻ロックだけがかかったローにはかけることができます。この柔軟性のため、データベース・サーバでは多くのオプションを利用できます。しかしそのために、幻ロックをかける場合は、読み込みロックの設定に特別な注意が要求されます。これを怠ると、他のトランザクションがローを削除してしまう可能性があります。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |