Sql-Server

SELECT 在快照隔離中阻止更新

  • May 2, 2018

我們有一個在 SQL Server 2016 SP1 Enterprise 上執行並Allow Snapshot Isolation已啟用的數據庫。在這種情況下,讀取器不會阻塞寫入器,寫入器不會阻塞讀取器。

今天我們看到一個SELECT-query 阻塞了一個UPDATE-query。這些是有問題的查詢:

第一個查詢:

IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SELECT TOP 10 Field1, Field2, Field3 FROM [dbo].[TABLE1] 
WHERE ([Field1] = @SV1 AND (1=1))
ORDER BY A.[Field1] ASC,A.[Field2] ASC
OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN)

第二個查詢:

UPDATE [dbo].[Table1] SET [Field4]= @V128, [Field5]= @V140, [Field6]= @V141 WHERE [Field3] = @ID0

如果正確理解版本控制,SELECT則 -query 不會使用任何鎖,因為它適用於數據的快照(在事務開始時獲取)。-query怎麼可能SELECT阻塞UPDATE?

如果 @@trancount <> 0 則 SELECT 將以目前事務隔離級別執行。其中(除非它已經是 SNAPSHOT)將需要 S 鎖來讀取數據。

如果您希望所有使用預設 READ COMMITTED 隔離級別的 SELECTS 使用行版本控製而不是 S 鎖,請在數據庫上設置 READ COMMITTED SNAPSHOT。

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