Sql-Server
SELECT 在快照隔離中阻止更新
我們有一個在 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。