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

Rac*_*SQL 0 sql-server sql-server-2012 locking

我们处于这样的情况:选择被更新阻止。但表格不同。

UPDATE [dbo].[TABLE_1]
SET ...

SELECT [t1].[field]
FROM [dbo].[TABLE_1] AS [t1]
WHERE...
Run Code Online (Sandbox Code Playgroud)

当它们同时运行时,这个简单的过程会阻塞这个过程:

SELECT "A lot of fields"
FROM TABLE_TOTALLY_DIFFERENT
INNER JOIN [another table totally different] 
ON...
WHERE...
Run Code Online (Sandbox Code Playgroud)

这对我来说毫无意义。

即使通过查看 pageID,我也可以看到在这种情况下被锁定的表是TABLE_TOTALLY_DIFFERENT.

但他们与他们无关。

我如何查找并确定它们被锁定的原因?

Zik*_*ato 5

有多个选项,您必须找到表之间的链接。

检查隐藏的引用:

  • 外键
  • 触发器
  • 标量 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%' 
Run Code Online (Sandbox Code Playgroud)