SQL Server 2012インスタンスでホストされているデータベースで、ALLOW_SNAPSHOT_ISOLATION
およびON
として状態を確認しました
SELECT snapshot_isolation_state_desc,name from sys.databases
ただし、2つの別々のセッションで、最初にTABLOCK
を使用し、2番目にUPDATE
を使用して長時間実行の選択を実行すると(またはその逆)、最初に開始したクエリが2番目のクエリをブロックします( sp_who2
)
見つめている
select * from sys.dm_exec_requests
、両方のクエリのトランザクション分離レベルは、読み取りコミット(2)です。
私の理解では、スナップショット分離をオンにすると、tempdbの使用率が増加しますが、この状況ではブロッキングは発生しません。この動作を実現するための設定手順が不足していますか?
デフォルトのREAD_COMMITTED
分離レベルで読者がライターをブロックしたり、その逆をブロックしたりしないようにする場合は、READ_COMMITTED_SNAPSHOT
データベースオプションをオンにします。これにより、ステートメントレベルの読み取り整合性を実装するために、ロックではなく行のバージョン管理が使用されます。
しばしば混乱しますが、ALLOW_SNAPSHOT_ISOLATION
オプションはREAD_COMMITTED_SNAPSHOT
とは関係ありません。 ALLOW_SNAPSHOT_ISOLATION
では、独立したSNAPSHOT
分離レベルを使用して複数ステートメントの読み取り一貫性を実現できますが、それを使用するにはコードの変更が必要です。 READ_COMMITTED_SNAPSHOT
オプションは、コードを変更せずにステートメントレベルの読み取り一貫性を提供しますが、ロック動作がロックに依存するアプリに与える影響に注意する必要があります。
ALLOW_SNAPSHOT_ISOLATION
を有効にしても、コードの動作は変わりません。代わりに、必要に応じて 行のバージョン管理 を使用できるように土台を築きます。スナップショット分離がデータベースに適用されると、次のステートメントが使用されている場合、クエリは行のバージョン管理を正常に使用できます。
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
ケンドラリトルによるこの投稿では、 スナップショット分離レベル について紹介しています。