Sql-Server

啟用 ALLOW_SNAPSHOT_ISOLATION 和 READ_COMMITTED_SNAPSHOT 時更新 SQL Server 中的查詢死鎖

  • April 10, 2017

設想:

我們了解到讀取操作被 MSSQL 鎖定,導致其他操作變慢。

後來,我們決定開啟兩個因素。

ALLOW_SNAPSHOT_ISOLATIONREAD_COMMITTED_SNAPSHOT整個數據庫。

啟用它們後,我們面臨來自多個客戶的更新查詢死鎖(具有 SQL Server 2008、2012、2014)

阻止交易:-

在此處輸入圖像描述

在辨識並執行辨識阻塞查詢的過程中,我們發現表 X 上的選擇查詢阻塞了多個表的更新/刪除過程。

一種這樣的阻塞更新語句是

BLOCKED UPDATE: UPDATE "ManagedComputer" SET "AGENT_EXECUTED_ON"= @P0 , "STATUS_UPDATED_TIME"= @P1 , "REMARKS"= @P2 , "MODIFIED_TIME"= @P3  WHERE ( ("ManagedComputer"."RESOURCE_ID" =  @P4 ) );

BLOCKING SELECT: SELECT "UserParams"."USER_ACCOUNT_ID", "UserParams"."PARAM_NAME", "UserParams"."PARAM_VALUE"  FROM "UserParams" WHERE  (("UserParams"."USER_ACCOUNT_ID" = 2) AND ("UserParams"."PARAM_NAME" COLLATE SQL_Latin1_General_CP1_CS_AS = 'stop_agent_workflow')) ;

READ_COMMITTED_SNAPSHOT 的唯一目的不是阻止更新/插入語句嗎?

我為查找阻塞和阻塞語句而執行的查詢如本文中所述

無論隔離級別如何,寫入器都會阻止同一行的其他寫入器。為避免在數據修改期間發生阻塞,請檢查執行計劃以確保查詢只觸及需要的行,並根據需要執行查詢和索引調整。

數據庫選項通過使用行版本控製而不是鎖定語句級別的讀取一致性來READ_COMMITTED_SNAPSHOT避免讀取器阻塞預設READ COMMITTED隔離級別的寫入器,但代價是行版本儲存和行內版本數據的額外成本。您無需設置ALLOW_SNAPSHOT_ISOLATION為使用READ_COMMITTED_SNAPSHOT. ALLOW_SNAPSHOT_ISOLATION允許使用單獨的SNAPSHOT隔離級別,它使用行版本控制提供事務級別(不僅僅是語句級別)的一致性。

@Surendhar_s,寫入者仍然在讀取送出的快照隔離中阻止寫入者。

您可以通過閱讀 Brent Ozar 的這篇精彩文章開始研究快照隔離級別:

在 SQL Server 中實現快照或讀取送出的快照隔離:指南

引用自:https://dba.stackexchange.com/questions/170589