INSERT オペレーションは新しいローを作成します。SQL Anywhere では、データ整合性を確保するために、挿入時に各種のロックを利用します。どの独立性レベルであっても実行している INSERT 文では、次の操作手順が発生します。
テーブルで共有スキーマロックを保持していない場合は、取得します。
テーブルで書き込みを意図したテーブルロックを保持していない場合は、取得します。
新しいローを格納するために、ページでロックされていない位置を検索します。ロック競合を最小限に抑えるために、データベースサーバは、削除された (しかし、まだコミットされていない) ローによって利用可能になった領域をただちに再利用しません。新しいローを確保するために、新しいページがテーブルに割り当てられることがあります。また、データベースファイルのサイズが増大することがあります。
新しいローに値を入れます。
ローを追加するテーブルに挿入ロックをかけます。挿入ロックは排他ロックであるため、一度挿入ロックをかけると、独立性レベル 3 の他のトランザクションは、幻ロックをかけて挿入をブロックすることができません。
新しいローに書き込みロックをかけます。書き込みロックが取得されると、挿入ロックが解放されます。
テーブルにローを挿入します。ここで、独立性レベル 3 の他のトランザクションは初めて新しいローの存在に気が付きます。ただし、すでに書き込みロックがかかっているため、これらのトランザクションはそのローの修正や削除はできません。
影響を受けるすべてのインデックスを更新し、必要に応じてユニークであることを確認します。プライマリキーの値はユニークである必要があります。他のカラムもユニークな値だけを含むように定義される場合があります。このようなカラムが存在する場合は、ユニーク性が検証されます。
テーブルが外部テーブルである場合は、プライマリテーブルの共有スキーマロックを保持していなければ取得し、挿入される外部キーカラムの値が NULL でない場合は、プライマリテーブルの一致するプライマリローで読み込みロックを取得します。データベースサーバは、挿入トランザクションで COMMIT が実行されたときにプライマリローが存在していることを保証する必要があります。この確認は、プライマリローの読み込みロックを取得して行います。読み込みロックをかけても他のトランザクションは自由にそのローを読むことができますが、削除や更新はできません。
対応するプライマリローが存在しない場合は、参照整合性制約違反が発生します。
最後の手順の後、テーブルで定義された AFTER INSERT トリガが起動します。トリガ内の処理におけるロック動作は、アプリケーションの場合と同じです。トランザクションがコミット (すべての参照整合性制約が満たされる) またはロールバックされると、すべての長期間ロックが解放されます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |