Ken*_*her 6 sql-server-2008 sql-server blocking
我有一个案例,我正在运行的查询需要很长时间。当我检查sys.dm_exec_requests
它blocking_session_id
是一个负值时,具体来说是-2。等待是一个LCK_M_X
,阻塞的命令是一个DELETE
语句。据我所知,目前没有其他东西触及那张桌子。事实上,唯一的活动请求是被阻止的连接和查询检查sys.dm_exec_requests
。当我查看sys.dm_tran_session_transactions
被阻止的会话时,只有一个出现。
看看 Bob Dorr 的这篇博文:How It Works: Orphan DTC Transaction (Session/SPID = -2)
正如鲍勃所说,它是 DTC 的孤立事务有点用词不当,但这通常是它代表自己的方式。这是由于(按照 Bob 的话)“SQL Server 上没有 ENLISTED SESSIONS,但事务还处于活动状态”。您应该完整地查看该链接。
通常 DTC 事务发生的情况是没有提交/回滚,这确实会带来问题,因为 MSDTC 可能不会重新连接以清理它、释放锁等。
请参阅sys.dm_tran_locks上的 BOL 参考:
与会话 ID 值无关的分布式事务是孤立事务,并被分配会话 ID 值 -2。有关详细信息,请参阅 KILL (Transact-SQL)。
是的,BOL 使用术语“孤立事务”,根据我的经验,这通常是它最终的结果(尽管如果没有适当调查分布式事务协调器确实没有忘记事务持有,您就不能做出笼统的声明一切都起来了)。在这种情况下,在适当的孤立确定之后,通常KILL
会基于工作单元 (UOW)。