10

我正在尝试跟踪我们的 SQL 2005 数据库(64 位)中发生的死锁。我们目前没有启用快照隔离。

我打开了 tf-1204 并收到了下面的输出。

从这个输出中,我能够确定节点 1 是一个存储过程,它选择数据并且只修改 #temp 表中的值。

节点 2 是另一个存储过程,它对单行数据执行基于简单主键的更新。

我无法确定的是这里争用的实际资源。10:72057594060734464 和 10:72057594038910976 的 Keys 允许我确定数据库,但是无法使用 object_name 解析这些对象 ID。事实上,它们应该是 int 值,所以我不确定这些大数字是从哪里来的。

在研究这个问题时,我也能够从对象 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 ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980
2008-12-05 07:48:28.19 spid4s 0:插入新节点:节点:1 ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598)值: 0x1043f980
2008-12-05 07:48:28.19 spid4s 1:SearchOR 考虑新的拦截器 - 任务:0000000000EC5198,工人 00000000C89881C0
2008-12-05 07:48:28.19 spid4s 2:插入新节点:节点:2 ResType:LockOwner Stype:'OR'Xdes:0x00000000808F1A80 模式:S SPID:79 BatchID:0 ECID:0 TaskProxy:(0x0000000129E82598)值: 0x1063d000
2008-12-05 07:48:28.19 spid4s 3:SearchOR 考虑新的拦截器 - 任务:0000000000C3FC18,工人 00000000F847C1C0
2008-12-05 07:48:28.19 spid4s 4:InsertKnown Cycle found between old res owner: [ ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598)值:0x1043f980] 和新资源所有者 [ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980]
2008-12-05 07:48:28.19 spid4s 4:InsertKnown 搜索结果:发现死锁(阻塞所有者在堆栈上)
2008-12-05 07:48:28.19 spid4s 3:SearchOR 搜索结果:发现死锁(循环在此级别或之前)
2008-12-05 07:48:28.19 spid4s 1:SearchOR 搜索结果:发现死锁(循环在此级别或之前)
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 ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598)值: 0x1043f980 成本:(0/1544)
2008-12-05 07:48:28.19 spid4s 1:SearchOR 考虑新的拦截器 - 任务:0000000000EC5198,工人 00000000C89881C0
2008-12-05 07:48:28.19 spid4s 2:插入新节点:节点:2 ResType:LockOwner Stype:'OR'Xdes:0x00000000808F1A80 模式:S SPID:79 BatchID:0 ECID:0 TaskProxy:(0x0000000129E82598)值: 0x1063d000 成本:(0/0)
2008-12-05 07:48:28.19 spid4s 3:SearchOR 考虑新的拦截器 - 任务:0000000000C3FC18,工人 00000000F847C1C0
2008-12-05 07:48:28.19 spid4s 4:InsertKnown Cycle found between old res owner: [ ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598)值:0x1043f980 成本:(0/1544)] 和新资源所有者 [ ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598)值:0x1043f980 成本:( 0/1544)]
2008-12-05 07:48:28.19 spid4s 4:InsertKnown 搜索结果:发现死锁(阻塞所有者在堆栈上)
2008-12-05 07:48:28.19 spid4s 3:SearchOR 搜索结果:发现死锁(循环在此级别或之前)
2008-12-05 07:48:28.19 spid4s 1:SearchOR 搜索结果:发现死锁(循环在此级别或之前)
2008-12-05 07:48:28.19 spid4s 遇到死锁 .... 打印死锁信息
2008-12-05 07:48:28.19 spid4s 等待图
2008-12-05 07:48:28.19 spid4s      
2008-12-05 07:48:28.19 spid4s 节点:1

2008-12-05 07:48:28.19 spid4s 密钥:10:72057594060734464(c80089667602)CleanCnt:3 模式:S 标志:0x0
2008-12-05 07:48:28.19 spid4s 授予列表 1:
2008-12-05 07:48:28.19 spid4s 所有者:0x000000011063CDC0 模式:S Flg:0x0 参考:1 寿命:00000000 SPID:79 ECID:0 XactLockInfo:0x00000000808F1AB8
2008-12-05 07:48:28.19 spid4s SPID: 79 ECID: 0 语句类型: INSERT Line #: 220
2008-12-05 07:48:28.19 spid4s 输入缓冲区:RPC 事件:过程 [数据库 ID = 10 对象 ID = 1751794144]
2008-12-05 07:48:28.19 spid4s 请求者:
2008-12-05 07:48:28.19 spid4s ResType:LockOwner Stype:'OR'Xdes:0x00000000813B8700 模式:X SPID:77 BatchID:0 ECID:0 TaskProxy:(0x00000000CE6D8598) 值:0x1043f980 成本:(0/1544)
2008-12-05 07:48:28.19 spid4s      
2008-12-05 07:48:28.19 spid4s 节点:2

2008-12-05 07:48:28.19 spid4s 密钥:10:72057594038910976 (0c0092f62b82) CleanCnt:2 模式:X 标志:0x0
2008-12-05 07:48:28.19 spid4s 授予列表 0:
2008-12-05 07:48:28.19 spid4s 所有者:0x000000011043F300 模式:X Flg:0x0 参考:0 寿命:02000000 SPID:77 ECID:0 XactLockInfo:0x00000000813B8738
2008-12-05 07:48:28.19 spid4s SPID:77 ECID:0 语句类型:更新行号:23
2008-12-05 07:48:28.19 spid4s 输入缓冲区:RPC 事件:过程 [数据库 ID = 10 对象 ID = 1791462302]
2008-12-05 07:48:28.19 spid4s 请求者:
2008-12-05 07:48:28.19 spid4s ResType:LockOwner Stype:'OR'Xdes:0x00000000808F1A80 模式:S SPID:79 BatchID:0 ECID:0 TaskProxy:(0x0000000129E82598) 值:0x1063d000 成本:(0/0)
2008-12-05 07:48:28.19 spid4s      
2008-12-05 07:48:28.19 spid4s 受害者资源所有者:
2008-12-05 07:48:28.19 spid4s ResType:LockOwner Stype:'OR'Xdes:0x00000000808F1A80 模式:S SPID:79 BatchID:0 ECID:0 TaskProxy:(0x0000000129E82598) 值:0x1063d000 成本:(0/0)
2008-12-05 07:48:28.19 spid4s 结束死锁搜索 634 ... 发现死锁。
2008-12-05 07:48:28.19 spid4s ----------------------------------
4

1 回答 1

14

这些 ID 实际上指的是 sys.partitions 中的 hobts(堆或二叉树)。在数据库 10 中尝试以下查询,您会发现哪个对象和哪个索引受到影响。

SELECT hobt_id, object_name(p.[object_id]), index_id 
FROM sys.partitions p 
WHERE hobt_id = 72057594060734464
于 2008-12-09T22:28:03.913 回答