我在我的 SQL Server 审核日志中看到如下所示的调用,但不知道它是什么意思。谷歌搜索发现了与编译/重新编译的可能关系。该行(或类似行)也可以在多个 SQL Server 内部存储过程中找到。
EXEC %%Object(MultiName = @objname).LockMatchID(ID = @objid, Exclusive = 1, BindInternal = 0)
有没有人了解这个过程?
我在我的 SQL Server 审核日志中看到如下所示的调用,但不知道它是什么意思。谷歌搜索发现了与编译/重新编译的可能关系。该行(或类似行)也可以在多个 SQL Server 内部存储过程中找到。
EXEC %%Object(MultiName = @objname).LockMatchID(ID = @objid, Exclusive = 1, BindInternal = 0)
有没有人了解这个过程?
它是一种内部方法,从名字上看大概是用来锁定一个基于对象的对象,
object_id
并确保执行用户有权对该对象进行进一步的更改。需要这种锁定来执行添加/删除属性、隐藏列等操作,并确保对象在此期间不能被其他人删除或更改(一般人倾向于通过启动事务和锁定来执行此操作)表通过一些间接的方法,因为没有LOCK TABLE
命令——但显然有内部管道来帮助系统操作)。如果您查看使用它的任何过程(有一个大列表):
您会看到前面的评论,例如:
(人们说注释代码是浪费时间。)
似乎也有
LockExclusiveMatchID
方法,尽管Exclusive
后来似乎已将参数添加到 中LockMatchID
,这使得独占方法已过时。不确定您需要对此更加具体 - 如果您想追踪这些事件发生率高的地方,您需要查看外部调用,而不是这个特定的声明。例如,您是否有一个应用程序经常重命名对象、
sp_autostats
直接调用、更改复制或您可以从上面生成的列表中推断出的任何其他内容?您必须弄清楚调用了哪些过程以帮助确定原因。而你将如何处理它(如果你甚至可以确定存在“问题”)将与LockMatchID
具体没有任何关系。我遇到了同样的问题,我看到在同样的 3 分钟内服务器上发生了由相同语句生成的很多锁和死锁。
通过死锁报告,我发现死锁发生在我的进程中,在我的案例中是这个系统进程:Proc [Database Id = 32767 Object Id = -993696157]
根据这篇文章,它与复制系统任务有关。
在我的案例中,这是来自 blocked-process-report\blocking-process\process\executionStack 的典型调用堆栈:
如果我用这个查询解码它:
然后我得到这个结果: