0

这可能是非常基本的,所以请耐心等待(另一方面,可能有一个很好的闪亮的干货答案!)。

我目前正在诊断一个死锁问题,实际上我可以看到我的一个会话被另一个会话阻止了。(死锁的另一端是 Java 线程以相反的顺序相互等待。)在 Management Studio 的进程资源管理器中显示进程的详细信息为我提供了阻塞会话的 SQL,但阻塞会话的 SQL显示作为“ EXEC sp_unprepare 807”。

现在我明白这与准备好的陈述有关,所以我本身并不为此感到不安。但是,我想知道实际的 SQL 是什么,这样我就知道在代码库中的何处投下怀疑的眼光。那么在这一点上,将其与该线程执行的实际 SQL 相关联的最佳方法是什么?是否有一个系统表,我可以在其中查找准备好的语句到他们的 SQL 的映射?可能是一个存储会话的最后n 个SQL 语句的表,该会话有望保持prepare调用?是否可以在数据库驱动程序连接上设置一个标志,以完全禁用此会话的准备好的语句?

我也欢迎解决这个问题的替代方法,如果它们是更好的方法(基本上我高度怀疑有一些 Java 代码在修改表后无法提交,我想知道 SQL 来提供帮助我找出它在哪里)。

4

2 回答 2

1

尝试这个

dbcc inputbuffer(spid)
于 2009-01-14T15:03:22.523 回答
0

使用 SQL Profiler 跟踪服务器上的活动,然后重新创建问题。使用服务器端游标时,SQL 将使用数字作为句柄。您可以通过 Profiler 输出跟踪这些句柄,以查看正在使用该句柄执行的其他内容。在句柄和 SPID 之间,您可以跟踪工作负载并深入探究问题的原因。

于 2009-01-15T21:29:00.467 回答