Sql server死锁问题 - 查询找出长时间运行的trans不返回任何内容

时间:2012-11-12 09:21:45

标签: sql-server sql-server-2005

我有一个查询来查找长时间运行的事务以解决死锁问题 -

SELECT spid, cmd, status, loginame, open_tran, datediff(s, last_batch, getdate ()) AS [WaitTime(s)] 
FROM master..sysprocesses p 
WHERE open_tran > 0 
AND spid > 50 
AND datediff (s, last_batch, getdate ()) > 30 
ANd EXISTS (SELECT * FROM master..syslockinfo l 
WHERE req_spid = p.spid AND rsc_type <> 2)

但它没有返回任何rcord,我仍然遇到我的应用程序的死锁问题。可能是什么原因?

3 个答案:

答案 0 :(得分:1)

  • DBCC TRACEON(1222,-1) - 要启用跟踪标记,死锁信息将记录到日志文件
  • DBCC TRACESTATUS (1222, -1) - 检查跟踪标志的状态
  • DBCC TRACEOFF (1222,-1) - 禁用跟踪标记

答案 1 :(得分:1)

我在某些方面意识到这需要澄清,但重要的是它属于答案。

死锁是一个非常具体的事件,其中2个进程正在等待相同的资源,并且它们处于catch-22情况,他们无法通过等待来解决它。良好的阅读There is a very simple explanation,即使它说SQL Server 2000.另请查看this great script to reproduce it。理解死锁的最重要的事情可能是它们通常非常快。您陷入僵局,SQL Server足够聪明,可以识别它并杀死其中一个进程。

因此,如果您仍然认为自己遇到了死锁,那么请回答#1,因为海报是正确的。如果你认为你正在让人们更松散地使用术语“死锁”,那就是锁定和阻塞进程占用资源的位置,而所有其他进程都需要等待。您可以通过运行SQL Server Profiler并慢慢处理问题进程来解决这些问题。

希望这有助于为未来的读者澄清,如果不是原始海报。确保你知道你在研究什么!

答案 2 :(得分:0)

你可以试试 DBCC TRACEON(1204)