我最近参与调试一个棘手的 SQL Server 锁定问题。我们最终通过研究应用程序代码弄清楚了发生了什么,但如果 SQL Server 提供更多信息会容易得多。我想知道是否有办法获取这些信息。这是一个简单的复制:
create table Table1 (k int primary key)
create table Table2 (k int primary key)
go
begin transaction
insert into Table1 values (1) -- acquire a lock
go
insert into Table2 values (2) -- acquire a second lock
go
我没有显示它,但应用程序正在提交事务,因为它应该有。但是,在提交发生之前,它会导致阻塞,并且我们的调试工具只报告最后执行的批处理/语句的文本——在这种情况下插入到 Table2 中——以及对应于完全不同对象的锁。(我的示例中的表 1。)
有没有办法获取与会话持有的所有锁相对应的 SQL,而不仅仅是最近的一批?
仅在 XEvents/Trace 中通过捕获 begin/end 语句以及获取和释放锁。这是一个非常冗长的跟踪,所以你很少会在生产系统上打开这样的跟踪。
sys.dm_tran_locks 列出了所有锁,但没有 DMV 存储导致获取锁的语句。