SQL Engineは、各トランザクションによりアクセスされるデータベース オブジェクトを自動的にロックし、他のトランザクションによる同時アクセスを防いだり制限したりします。SQL Engineは、トランザクションの完了時にトランザクションが開始してロックを解放する前にデータでのロックを要求します。
ロック レベル | 説明 |
---|---|
読み取り | 書き込みロックと排他ロックを防ぐ。通常はSELECTで実行。 読み取り操作中の整合性を確保する。複数のユーザーが、同じデータで並行読取りロックを持つ場合があるが、この間データの編集は許可されない。 |
書き込み | 他の読み取り、書き込み、排他ロックを防ぐ。通常は、INSERT、UPDATE、またはDELETE文で実行。 アクセス ロックを使用しているユーザー以外のすべてのユーザーをロック アウトしている間、ユーザーはデータを変更できる。書込みロックが解除されるまで、新規の読取りまたは書込みロックは許可されない。 |
排他 | 他のタイプの同時アクセスをすべて防ぐ。通常は、例えばLOCKING修飾子を使用したALTER TABLE文による列の追加、削除、変更などの、構造上の変更を加える文で実行。 排他ロックは最も制約の厳しいロックである。排他ロックを保有する場合、他のユーザーはデータの読み出しまたは書き込みを実行できない。 |
アクセス | 排他ロックのみを防ぐ。LOCKING…FOR ACCESSまたはLOCKING…FOR LOAD COMMITTEDロッキング修飾子により生じます。 LOCKING…FOR ACCESSロッキング修飾子を使用すると、変更の実行中にデータを読み取ることができます。ただし、この修飾子を使用すると、同時リクエストがコミット済みでないデータにアクセスし、不整合な結果の原因になる場合があります。この修飾子は、少数の単一行の変更のみで更新される大きなテーブルでの意思決定支援に使用します。 ロード分離テーブルでLOCKING…FOR LOAD COMMITTEDロッキング修飾子を使用すると、同時並行での変更の実行中にコミット済みの行を読み取ることができます。LOCKING…FOR ACCESSとは異なり、この修飾子はコミット済みデータのみを返します。ロード分離の詳細については、同じテーブルへのロードと並行したコミット済みデータ読み取りについてを参照してください。 |