我正在尝试追踪发生在我们SQL 2005(64位)数据库中的死锁。我们目前没有启用快照隔离。
我打开tf-1204并收到如下输出。从这个输出中,我可以确定节点1是一个存储过程,它选择数据,并仅修改#temp表中的值。
节点2是另一个存储过程,它对单行数据执行简单的主键基础更新。
我无法确定实际争用的资源。10:72057594060734464和10:72057594038910976的键使我能够确定数据库,但是这些对象ID无法通过object_name解析。事实上,它们应该是int值,所以我不确定这些大数字来自哪里。
在研究问题时,我还能从Activity Monitor中获得类似于对象ID的值。
我该如何解决这些对象标识符?
以下是死锁tf-1204输出:
2008-12-05 07:48:28.19 spid4s ---------------------------------- 2008-12-05 07:48:28.19 spid4s 开始死锁搜索 634 2008-12-05 07:48:28.19 spid4s 目标资源所有者: 2008-12-05 07:48:28.19 spid4s 资源类型: 锁所有者 状态:'OR' Xdes:0x00000000813B8700 模式: X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980 2008-12-05 07:48:28.19 spid4s 0:插入新节点: 节点:1 资源类型: 锁所有者 状态:'OR' Xdes:0x00000000813B8700 模式: X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980 2008-12-05 07:48:28.19 spid4s 1:搜索OR 考虑新的阻塞者 - 任务: 0000000000EC5198, 工作线程 00000000C89881C0 2008-12-05 07:48:28.19 spid4s 2:插入新节点: 节点:2 资源类型: 锁所有者 状态:'OR' Xdes:0x00000000808F1A80 模式: S SPID:79 BatchID:0 ECID:0 TaskProxy:(0x0000000129E82598) 值:0x1063d000 2008-12-05 07:48:28.19 spid4s 3:搜索OR 考虑新的阻塞者 - 任务: 0000000000C3FC18, 工作线程 00000000F847C1C0 2008-12-05 07:48:28.19 spid4s 4:已知环路,旧资源所有者: [ 资源类型: 锁所有者 状态:'OR' Xdes:0x00000000813B8700 模式: X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980] 和新的资源所有者 [ 资源类型: 锁所有者 状态:'OR' Xdes:0x00000000813B8700 模式: X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980] 2008-12-05 07:48:28.19 spid4s 4:已知环路搜索结果: 发现死锁(阻塞所有者在堆栈上) 2008-12-05 07:48:28.19 spid4s 3:搜索OR搜索结果: 发现死锁(此级别或之前的循环) 2008-12-05 07:48:28.19 spid4s 1:搜索OR搜索结果: 发现死锁(此级别或之前的循环) 2008-12-05 07:48:28.19 spid4s 2008-12-05 07:48:28.19 spid4s 遇到死锁循环....正在验证循环 2008-12-05 07:48:28.19 spid4s 0:插入新节点: 节点:1 资源类型: 锁所有者 状态:'OR' Xdes:0x00000000813B8700 模式: X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980 成本:(0/1544) 2008-12-05 07:48:28.