分離レベル オプションは一度に 1 つだけ設定でき、設定したオプションは明示的に変更されない限り、その接続で継続的に使用されます。ステートメントの FROM 句内にあるテーブル ヒントで、テーブルに対して別のロック動作やバージョン管理動作が指定されない限り、トランザクションのすべての読み取り操作は、指定した分離レベルのルールに従って実行されます。
トランザクションの分離レベルでは、読み取り操作に対して取得されるロックの種類が定義されます。READ COMMITTED または REPEATABLE READ で取得される共有ロックは通常、行ロックです。読み取り操作でページまたはテーブルの行が大量に参照される場合は、ページ ロックまたはテーブル ロックに変更される場合があります。トランザクションで行の読み取り後に変更が行われる場合、そのトランザクションでは排他ロックによって行が保護され、トランザクションが完了するまでその状態が保持されます。たとえば REPEATABLE READ トランザクションで、行に対する共有ロックが取得され、その行が変更される場合、共有行ロックは排他行ロックに変わります。
分離レベルはトランザクションの実行中いつでも変更できます。ただし、どの分離レベルでも、SNAPSHOT 分離レベルに変更した場合は例外が発生します。このときトランザクションは失敗し、ロールバックされます。SNAPSHOT 分離で開始したトランザクションを他の任意の分離レベルに変更することはできます。
トランザクションの分離レベルを変更した場合、変更後に読み取られるリソースは、新しいレベルのルールに従って保護されます。変更前に読み取られたリソースは、引き続き以前のレベルのルールに従って保護されます。たとえば、トランザクションが READ COMMITTED から SERIALIZABLE に変更された場合、変更後に取得される共有ロックは、トランザクションの終了まで保持されるようになります。
SET TRANSACTION ISOLATION LEVEL をストアド プロシージャまたはトリガで実行した場合は、オブジェクトから制御が返されると、分離レベルはオブジェクトの呼び出し時に使用されていたレベルに再設定されます。たとえば、バッチで REPEATABLE READ を設定し、このバッチからストアド プロシージャを呼び出して分離レベルを SERIALIZABLE に設定した場合、ストアド プロシージャからバッチに制御が返されると、分離レベルの設定は REPEATABLE READ に戻ります。
メモ : |
|---|
|
ユーザー定義関数と共通言語ランタイム (CLR) ユーザー定義型では、SET TRANSACTION ISOLATION LEVEL は実行できません。ただし、テーブル ヒントを使用して分離レベルを指定することはできます。詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。
|
sp_bindsession を使用して 2 つのセッションをバインドすると、各セッションではそれぞれの分離レベル設定が保持されます。SET TRANSACTION ISOLATION LEVEL を使用してセッションの分離レベル設定を変更しても、そのセッションにバインドしている他のセッションの設定に影響はありません。
SET TRANSACTION ISOLATION LEVEL は、解析時ではなく実行時に有効なレベルです。
ヒープに対して最適化された一括読み込み操作を行うと、次の分離レベルで実行されるクエリがブロックされます。
-
SNAPSHOT
-
READ UNCOMMITTED
-
READ COMMITTED (行バージョン管理を使用する場合)
一方、これらの分離レベルでクエリを実行すると、ヒープに対する最適化された一括読み込み操作がブロックされます。一括読み込み操作の詳細については、「一括インポート操作と一括エクスポート操作について」および「一括インポートのパフォーマンスの最適化」を参照してください。