`select OBJECT_ID(N'X')` 需要“永远”

TN.*_*TN. 1 sql-server

我遇到过 SQL Server 的奇怪状态。在一个特定的数据库中,此 SQL Serverselect OBJECT_ID(N'X')需要“永远”。如何诊断发生了什么?

编辑:问题消失了。不过,我还是很好奇到底发生了什么。

Aar*_*and 5

OBJECT_ID()(以及其他几个元数据函数)必须观察对对象采取的锁定,并等待它们被释放。我通常建议不要使用它们,因为除非您确实等待锁释放(这是完全有效的,但不常见),否则您最终会被阻塞。这就是我怀疑这里发生的事情,尽管现在没有办法证明这一点。

我在这里写了一篇博客:

解决方法是不使用函数,而是从目录视图中提取值。它是更多的代码,但它会遵守隔离语义,与函数不同,函数不会。所以而不是:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT OBJECT_ID(N'dbo.foo'); 
-- actually won't obey isolation level
Run Code Online (Sandbox Code Playgroud)

你说:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- will obey isolation level
SELECT o.[object_id] 
  FROM sys.objects AS o
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE s.name = N'dbo'
  AND o.name = N'foo';
Run Code Online (Sandbox Code Playgroud)

同样,它需要更多代码,但您已经在这里找到了便利的代价。遗憾的是模式名称没有作为计算列公开;我在这里写了一篇关于创建自己的视图来解决这个问题和其他复杂性的提示: