Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ SQL の使用法 » トランザクションと独立性レベル » ロックの仕組み

 

挿入時のロック

INSERT オペレーションは新しいローを作成します。SQL Anywhere では、データ整合性を確保するために、挿入時に各種のロックを利用します。どの独立性レベルであっても実行している INSERT 文では、次の操作手順が発生します。

  1. テーブルで共有スキーマロックを保持していない場合は、取得します。

  2. テーブルで書き込みを意図したテーブルロックを保持していない場合は、取得します。

  3. 新しいローを格納するために、ページでロックされていない位置を検索します。ロック競合を最小限に抑えるために、データベースサーバは、削除された (しかし、まだコミットされていない) ローによって利用可能になった領域をただちに再利用しません。新しいローを確保するために、新しいページがテーブルに割り当てられることがあります。また、データベースファイルのサイズが増大することがあります。

  4. 新しいローに値を入れます。

  5. ローを追加するテーブルに挿入ロックをかけます。挿入ロックは排他ロックであるため、一度挿入ロックをかけると、独立性レベル 3 の他のトランザクションは、幻ロックをかけて挿入をブロックすることができません。

  6. 新しいローに書き込みロックをかけます。書き込みロックが取得されると、挿入ロックが解放されます。

  7. テーブルにローを挿入します。ここで、独立性レベル 3 の他のトランザクションは初めて新しいローの存在に気が付きます。ただし、すでに書き込みロックがかかっているため、これらのトランザクションはそのローの修正や削除はできません。

  8. 影響を受けるすべてのインデックスを更新し、必要に応じてユニークであることを確認します。プライマリキーの値はユニークである必要があります。他のカラムもユニークな値だけを含むように定義される場合があります。このようなカラムが存在する場合は、ユニーク性が検証されます。

  9. テーブルが外部テーブルである場合は、プライマリテーブルの共有スキーマロックを保持していなければ取得し、挿入される外部キーカラムの値が NULL でない場合は、プライマリテーブルの一致するプライマリローで読み込みロックを取得します。データベースサーバは、挿入トランザクションで COMMIT が実行されたときにプライマリローが存在していることを保証する必要があります。この確認は、プライマリローの読み込みロックを取得して行います。読み込みロックをかけても他のトランザクションは自由にそのローを読むことができますが、削除や更新はできません。

    対応するプライマリローが存在しない場合は、参照整合性制約違反が発生します。

最後の手順の後、テーブルで定義された AFTER INSERT トリガが起動します。トリガ内の処理におけるロック動作は、アプリケーションの場合と同じです。トランザクションがコミット (すべての参照整合性制約が満たされる) またはロールバックされると、すべての長期間ロックが解放されます。

 ユニーク性
 オーファンと参照整合性
 wait_for_commit