0

0

SQL并发事务死锁分析_死锁图与锁顺序优化

舞夢輝影

舞夢輝影

发布时间:2026-03-08 13:52:02

|

532人浏览过

|

来源于php中文网

原创

死锁是多个事务因锁顺序不一致互相等待而被数据库主动终止,关键在统一加锁顺序、减少锁粒度与持有时间,并通过监控将死锁变为可观测指标。

sql并发事务死锁分析_死锁图与锁顺序优化

死锁不是事务执行失败,而是两个或多个事务互相等待对方持有的锁,形成循环依赖,数据库主动终止其中一个事务来打破僵局。关键不在“谁先执行”,而在“加锁顺序是否一致”。

看懂死锁图:定位冲突对象与等待链

SQL Server 的死锁图(Deadlock Graph)是 XML 格式可视化结果,核心看三部分:

  • Victim Process:被选为牺牲者的进程,含 SPID、语句文本、等待资源类型(如 KEY、PAGE、OBJECT)
  • Resource List:列出所有被争用的资源,重点关注 objectname(表名)、indexname(索引)、key(具体键值或哈希)
  • Process List:每个参与事务的执行栈,注意 inputbuf(实际 SQL)、waitresource(等待什么)、owner-list(谁持有该资源)

典型模式:事务 A 持有表 T1 的行锁,等待 T2 的行锁;事务 B 持有 T2 的行锁,等待 T1 的行锁 → 形成 T1↔T2 循环。

锁顺序不一致是主因:从代码层统一访问次序

多数死锁源于应用逻辑中对多张表或同一表多行的更新顺序随机。例如:

Boba.video
Boba.video

AI动漫视频生成器

下载
  • 订单服务先更新 orders 再更新 inventory
  • 库存服务先更新 inventory 再更新 orders

解决方法不是加重试,而是约定全局顺序:

  • 按字母顺序访问表:inventoryorderslog
  • 对同一表多行更新,按主键升序排序后再执行:UPDATE ... WHERE id IN (5,1,9) → 改为 WHERE id IN (1,5,9)
  • 在存储过程中显式用 SELECT ... WITH (UPDLOCK, HOLDLOCK) 提前申请锁,避免后续 UPDATE 触发锁升级冲突

减少锁粒度与持有时间:让事务更“轻”

长事务 + 粗粒度锁 = 死锁温床。优化方向明确:

  • 拆分大事务:把一个更新 1000 行的事务,改为每次 100 行 + 显式 COMMIT
  • 避免在事务中调用外部服务、文件读写、长时间计算
  • 用覆盖索引让 UPDATE/DELETE 走索引查找而非聚簇扫描,减少锁住的行数
  • 确认隔离级别是否过度:READ COMMITTED 就够用时,不用 REPEATABLE READ

监控与预防:把死锁从事故变成指标

死锁不应只靠报错发现,而应纳入可观测体系:

  • 开启 SQL Server 的 trace flag 1222 或使用 Extended Events 捕获死锁事件,自动解析并告警
  • 定期查 sys.dm_tran_lockssys.dm_exec_requests,识别长期持有锁的会话
  • 在应用日志中结构化记录被终止事务的 SPID、SQL、影响行数,便于关联业务场景
  • 压测阶段强制模拟高并发路径,验证锁顺序逻辑是否稳定

不复杂但容易忽略。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1110

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

380

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2069

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1622

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

439

2024.04.29

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号