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.
但他们与他们无关。
我如何查找并确定它们被锁定的原因?
有多个选项,您必须找到表之间的链接。
检查隐藏的引用:
锁定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)
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |