web-dev-qa-db-ja.com

スナップショット分離を有効にした後もブロックが続く

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の使用率が増加しますが、この状況ではブロッキングは発生しません。この動作を実現するための設定手順が不足していますか?

3
Akash

デフォルトのREAD_COMMITTED分離レベルで読者がライターをブロックしたり、その逆をブロックしたりしないようにする場合は、READ_COMMITTED_SNAPSHOTデータベースオプションをオンにします。これにより、ステートメントレベルの読み取り整合性を実装するために、ロックではなく行のバージョン管理が使用されます。

しばしば混乱しますが、ALLOW_SNAPSHOT_ISOLATIONオプションはREAD_COMMITTED_SNAPSHOTとは関係ありません。 ALLOW_SNAPSHOT_ISOLATIONでは、独立したSNAPSHOT分離レベルを使用して複数ステートメントの読み取り一貫性を実現できますが、それを使用するにはコードの変更が必要です。 READ_COMMITTED_SNAPSHOTオプションは、コードを変更せずにステートメントレベルの読み取り一貫性を提供しますが、ロック動作がロックに依存するアプリに与える影響に注意する必要があります。

7
Dan Guzman

ALLOW_SNAPSHOT_ISOLATIONを有効にしても、コードの動作は変わりません。代わりに、必要に応じて 行のバージョン管理 を使用できるように土台を築きます。スナップショット分離がデータベースに適用されると、次のステートメントが使用されている場合、クエリは行のバージョン管理を正常に使用できます。

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

ケンドラリトルによるこの投稿では、 スナップショット分離レベル について紹介しています。

5
James Anderson