查找阻塞进程发出的最后一条命令

mwe*_*ber 3 sql-server locking

我已经开发了一个从ERP SAP Business One仓库管理到仓库管理的接口,并且面临着与数据库锁有关的问题。我的程序包括对ERP数据库的直接写入操作(在创建或更改销售订单后的异步事件处理期间填充用户定义的字段)。它被怀疑是造成每天经常发生的阻塞情况的原因。

当发生阻塞情况时,sp_who2给我有关阻塞和阻塞进程的信息,每次都指向一个spidBPM管理软件用作“根阻塞进程”。其状态spid始终显示为“睡眠”。

  1. “休眠”进程是否会导致其他进程的数据库锁定,例如,当事务未提交时?

  2. 如何找出睡眠过程的最后一个命令?

Kin*_*hah 5

2)我怎样才能找出睡眠过程的最后一个命令?

您可以使用 Adam Machanic 的sp_whoisActive工具来查找主要拦截器

您还可以使用 DMV(从 sql 2005 及更高版本开始)来找出 spid 正在执行的内容:

-- You can use "most_recent_sql_handle" in sys.dm_exec_connections to see the last statement that was executed.    
SELECT  c.session_id, t.text,
            QUOTENAME(OBJECT_SCHEMA_NAME(t.objectid, t.dbid)) + '.'
            + QUOTENAME(OBJECT_NAME(t.objectid, t.dbid)) proc_name,
            c.connect_time,
            s.last_request_start_time,
            s.last_request_end_time,
            s.status
    FROM    sys.dm_exec_connections c
    JOIN    sys.dm_exec_sessions s
            ON c.session_id = s.session_id
    CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) t
    WHERE   c.session_id = -- spid for the spid involved in blocking

-- for any OPEN Transactions, you can use `sys.dm_tran_session_transactions` and `sys.dm_tran_active_transactions`

SELECT  st.transaction_id,
        at.name,
        at.transaction_begin_time,
        at.transaction_state,
        at.transaction_status
FROM    sys.dm_tran_session_transactions st
JOIN    sys.dm_tran_active_transactions at
        ON st.transaction_id = at.transaction_id
 WHERE   st.session_id = -- spid for the spid involved in blocking 
Run Code Online (Sandbox Code Playgroud)

参考:

或者,您可以将事件通知或 Profiler 与阻塞进程报告结合使用来检测数据库服务器上的阻塞情况。