使用 SQL Server Profiler 确定死锁的原因。 对于 SQL Server 中的某些资源集,在两个或多个线程或进程之间存在循环依赖关系时,会发生死锁。 使用 SQL Server Profiler,可以创建记录、重播和显示死锁事件的跟踪以进行分析。
若要跟踪死锁事件,请将 Deadlock graph 事件类添加到跟踪。 此事件类会在跟踪中的 TextData 数据列中填充有关死锁中涉及的进程和对象的 XML 数据。 SQL Server Profiler 可将 XML 文档提取到死锁 XML (.xdl) 文件,你稍后可在 SQL Server Management Studio 中查看该文件。 您可以配置 SQL Server Profiler ,将 Deadlock graph 事件提取到一个包含了所有 Deadlock graph 事件的文件中,或提取到多个单独的文件中。 可以通过下列任一方法进行提取:
在跟踪配置时,使用“事件提取设置”选项卡。在“事件选择”选项卡上选择死锁图形事件之前,不会显示此选项卡。
使用 “文件” 菜单上的 “提取 SQL Server 事件” 选项。
通过右键单击特定事件并选择“提取事件数据”,也可以提取并保存各个事件。
死锁图
SQL Server Profiler 和 SQL Server Management Studio 使用死锁等待图形来描述死锁。 此死锁等待图形中包含进程节点、资源节点以及表示进程和资源之间关系的边。 等待图形的组件的定义如下表所示:
节点 | DESCRIPTION |
---|---|
进程节点 | 执行任务的线程;例如,或 INSERT UPDATE DELETE 。 |
资源节点 | 数据库对象。例如,表、索引或行。 |
Microsoft Edge | 进程和资源之间的关系。 当进程等待资源时,将出现 request 边。 当资源等待进程时,将出现 owner 边。 边说明中包括了锁模式。 例如,模式: X。 |
死锁进程节点
在等待图形中,进程节点包含有关进程的信息。 下表介绍了进程的组件。
组件 | 定义 |
---|---|
服务器进程 ID | 会话 ID (SPID),即服务器给拥有锁的进程分配的标识符。 |
服务器批次 ID | 服务器批标识符 (SBID)。 |
执行上下文 ID | 执行上下文标识符 (ECID)。 与特定会话 ID 关联的给定线程的执行上下文 ID。 ECID = { 0, 1, 2, 3, ...n },其中 0 始终表示主线程或父线程,{ 1、2、 3...n } 表示子线程。 |
死锁优先级 | 进程的死锁优先级。 有关可能值的详细信息,请参阅 SET DEADLOCK_PRIORITY。 |
已用日志 | 进程所使用的日志空间量。 |
所有者 ID | 正在使用事务并且当前正在等待锁的进程的事务 ID。 |
事务描述符 | 指向描述事务状态的事务描述符的指针。 |
输入缓冲区 | 当前进程的输入缓冲区。定义了事件的类型和正在执行的语句。 可能的值包括: 语言 RPC 无 |
声明 | 语句类型。 可能的值包括: NOP 选择 更新 插入 删除 未知 |
死锁资源节点
在死锁中,两个进程都在等待对方占用的资源。 在死锁图形中,资源显示为资源节点。