Blocking_session_id 怎么可能是负 2?

Ken*_*her 6 sql-server-2008 sql-server blocking

我有一个案例,我正在运行的查询需要很长时间。当我检查sys.dm_exec_requestsblocking_session_id是一个负值时,具体来说是-2。等待是一个LCK_M_X,阻塞的命令是一个DELETE语句。据我所知,目前没有其他东西触及那张桌子。事实上,唯一的活动请求是被阻止的连接和查询检查sys.dm_exec_requests。当我查看sys.dm_tran_session_transactions被阻止的会话时,只有一个出现。

Tho*_*ger 7

看看 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)。