SQL Server 死锁与错误处理全解析
1. 死锁概述
死锁是一种循环阻塞的情况,可能涉及两个或多个会话。例如,会话 X 阻塞会话 Y,会话 Y 阻塞会话 Z,会话 Z 又阻塞会话 X。SQL Server 通常每 5 秒主动搜索一次死锁。当检测到死锁时,会根据死锁发生的频率将搜索间隔缩短至 100 毫秒。若一段时间内没有死锁,搜索间隔会恢复到 5 秒。一旦检测到死锁,SQL Server 会选择一个会话作为死锁牺牲品,并终止其事务,该会话会收到错误代码 1205,事务内的所有工作会被回滚,所有锁会被释放。
SQL Server 选择死锁牺牲品基于两个标准:
- 可以在会话中设置 DEADLOCK_PRIORITY 选项,取值范围为 -10 到 10,SQL Server 会选择死锁优先级最低的会话作为牺牲品。
- 若优先级相同,SQL Server 会根据事务日志中记录的信息估计每个事务回滚所需的工作量,选择工作量最少的事务。
- 若优先级和估计的工作量都相同,SQL Server 会随机选择牺牲品。
SQL Server 提供了一些工具来排查死锁:
- 跟踪标志 1222 和 1204 会使 SQL Server 将死锁信息写入错误日志。
- 跟踪事件 Deadlock graph 和扩展事件 xml_deadlock_report (默认系统健康会话的一部分)可用于生成 XML 格式的死锁图,该图可在 Profiler 和 SSMS 中以图形方式查看。
- 还可以运行跟踪或扩展事件会话,包含以下事件: sql
超级会员免费看
订阅专栏 解锁全文
22

被折叠的 条评论
为什么被折叠?



