Sql-Server
表 X 上的更新如何鎖定表 Y?
我們處於選擇被更新阻止的情況。但桌子是不同的。
UPDATE [dbo].[TABLE_1] SET ... SELECT [t1].[field] FROM [dbo].[TABLE_1] AS [t1] WHERE...
當它們同時執行時,這個簡單的過程會阻止這個:
SELECT "A lot of fields" FROM TABLE_TOTALLY_DIFFERENT INNER JOIN [another table totally different] ON... WHERE...
這對我來說毫無意義。
即使通過查看 pageID,我也可以看到在這種情況下被鎖定的表是
TABLE_TOTALLY_DIFFERENT
.但他們與他們無關。
我如何尋找並確定它們被鎖定的原因?
有幾個選項,您必須找到表之間的連結。
檢查隱藏的引用:
外鍵
觸發器
標量 UDF
- 在計算列中
- 檢查約束
鎖定
TABLE_TOTALLY_DIFFERENT
可能是在一個更大事務的一部分的不同語句中進行的,而這只是在blocked_process_reportUPDATE TABLE_1
中顯示的最新語句。還有另一種選擇。您有一個組合這些不相關表的索引視圖
我在這裡寫關於這個特定案例的部落格 https://straightforwardsql.com/posts/is-lock-in-rcsi-enabled-database/
這是如何檢查的程式碼
SELECT v.object_id , SCHEMA_NAME(v.schema_id) AS schemaName , v.name AS viewName , i.name AS indexName , dsre.referenced_schema_name AS refSchema , dsre.referenced_entity_name AS refObject , dsre.referenced_minor_name AS refColumn FROM sys.views AS v JOIN sys.indexes AS i ON i.object_id = v.object_id AND i.index_id = 1 /* Clustered */ CROSS APPLY sys.dm_sql_referenced_entities ( CONCAT ( OBJECT_SCHEMA_NAME(v.object_id) , '.' , v.name ) , 'OBJECT' ) AS dsre WHERE dsre.referenced_entity_name LIKE '%TABLE_TOTALLY_DIFFERENT%'