Sql-Server

表 X 上的更新如何鎖定表 Y?

  • July 20, 2022

我們處於選擇被更新阻止的情況。但桌子是不同的。

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%' 

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