用于监视Sql Server锁的SQl语句

时间:2010-07-13 17:07:24

标签: sql-server-2005 deadlock

我可以用来监视由UPDATE语句引起的SQL Server死锁的SQL语句(函数或存储过程)吗?

3 个答案:

答案 0 :(得分:3)

尝试此查询以查看阻止进程,包括实际的SQL查询文本:

SELECT
    r.session_id AS spid
        ,r.cpu_time,r.reads,r.writes,r.logical_reads 
        ,r.blocking_session_id AS BlockingSPID
        ,LEFT(OBJECT_NAME(st.objectid, st.dbid),50) AS ShortObjectName
        ,LEFT(DB_NAME(r.database_id),50) AS DatabaseName
        ,s.program_name
        ,s.login_name
        ,OBJECT_NAME(st.objectid, st.dbid) AS ObjectName
        ,SUBSTRING(st.text, (r.statement_start_offset/2)+1,( (CASE r.statement_end_offset
                                                                  WHEN -1 THEN DATALENGTH(st.text)
                                                                  ELSE r.statement_end_offset
                                                              END - r.statement_start_offset
                                                             )/2
                                                           ) + 1
                  ) AS SQLText
    FROM sys.dm_exec_requests                          r
        JOIN sys.dm_exec_sessions                      s ON r.session_id = s.session_id
        CROSS APPLY sys.dm_exec_sql_text (sql_handle) st
    --WHERE r.session_id!=@@SPID --uncomment to not see this query
使用分析器很容易陷入死锁:

尝试在探查器中运行跟踪运行(选择空白模板),选择“死锁图形事件”,然后在出现的新选项卡上(事件提取设置),保存每个(检查“单独保存死锁XML事件”) “)在自己的文件中。在xml查看器中打开此文件,可以很容易地判断发生了什么。每个进程都包含在内,包含一个procedure / trigger / etc调用执行堆栈等等,所有锁都在那里。

查看文件的“资源列表”部分,它将显示导致死锁的每个进程锁定和保留的内容。弄清楚如何解锁其中一个并解决死锁问题。

让这个跟踪运行直到再次发生死锁,仅在发生死锁时记录信息,因此没有太多开销。如果它再也不会发生,好的就会解决,如果不是你已经捕获了所有的信息。

答案 1 :(得分:2)

我认为您最好使用SQL事件探查器来监控死锁 - 请参阅here。 SQL事件探查器显示图中的死锁,以便更容易确定导致它们的原因。

答案 2 :(得分:0)

SELECT * FROM sys.dm_exec_requests WHERE blocking_session_id <> 0

但是这会显示阻塞的请求,这对SQL Server来说是正常的,并不表示死锁。如果SQL Server检测到死锁,它将终止其中一个进程以允许其他进程继续。因此,您不能使用函数或存储过程来监视它,因为它已经完成时。

您可以使用SQL ProfilerTrace Flags