运行 sp_who2 并跟踪 BlkBy 直到阻塞的根本原因,返回一个 CPUTime 和 DiskIO 值为 0 的 SPID;但它阻止了其他 4 个 SPID。
我对这怎么可能感到困惑;特别是 CPUTime 看起来很奇怪,因为为了获得锁,您必须花费一些时间来请求资源/请求锁本身。
CPUTime 以毫秒为单位,因此虽然资源的请求和锁定可能发生得足够快以在此处具有向下舍入的值,但这有点令人惊讶。
此外,这些 SPIDS 有时已经存在了几分钟;但似乎除了阻止原因外什么也没做。
问题
SPID 如何在 CPU 时间为零的情况下导致阻塞?
我问是因为我怀疑我对 CPU 时间统计信息的理解有所欠缺。如果有人可以建议采取明智的步骤来帮助调查此类问题,那也很有用。
当应用程序使用隐式事务时,有时会发生这种情况
sp_who2 确实令人困惑并没有帮助——Aaron是对的,您最好使用sp_WhoIsActive或sp_BlitzWho来查找正在运行的查询。
隐式交易的一个死角是看到像
begin tran
or这样的查询文本IF @@TRANCOUNT > 0
。当然,当查询使用显式事务时,也会发生这种情况。在代码中捕获它们要容易得多。
至于为什么 CPU 时间非常低——好吧,不需要太多的 CPU 就可以对一行进行索引查找并锁定它,然后对也需要该行的任何其他查询造成问题。