0

0

为什么不建议滥用事务_mysql性能与设计权衡

P粉602998670

P粉602998670

发布时间:2026-01-03 09:07:02

|

544人浏览过

|

来源于php中文网

原创

事务非万能,滥用会拖慢MySQL性能、加剧锁冲突、增加资源消耗;需避免长事务、耗时操作、大事务批量更新,合理设置隔离级别与超时机制,并明确事务必要性。

为什么不建议滥用事务_mysql性能与设计权衡

事务不是万能的,滥用反而拖慢 MySQL 性能、增加锁冲突、消耗更多资源。核心问题在于:事务的本质是保证 ACID,而实现一致性与持久性需要额外开销——尤其是锁、日志写入和回滚段管理。

事务会显著放大锁竞争

一个 UPDATE 或 DELETE 语句加行锁,本身影响有限;但包在长事务里,锁可能持续几秒甚至更久。其他会话想改同一行,就得等——不是“慢一点”,而是直接阻塞或超时失败。

  • 避免在事务里做耗时操作(如调外部 API、处理大数组、生成报表)
  • 读多写少场景下,用 READ COMMITTED 隔离级别比默认的 REPEATABLE READ 更轻量,减少间隙锁范围
  • 批量更新尽量拆成小事务(比如每次 500 行),而不是一口气 update 10 万行

Redo/Undo 日志压力随事务增长非线性上升

每个事务提交前,MySQL 必须把 redo 日志刷到磁盘(受 innodb_flush_log_at_trx_commit 控制);大事务还会大量写 undo 日志,用于回滚和 MVCC。日志写入变慢,整个写入吞吐就卡住。

  • 不设超长事务(例如超过 60 秒),监控 information_schema.INNODB_TRX 表及时发现
  • 避免在事务中执行 SELECT ... FOR UPDATE 拿锁后长时间空转
  • 大表 DDL(如加索引)不要放在业务事务里,应单独低峰期执行

事务边界模糊导致隐式性能陷阱

ORM 框架(如 Laravel、Django)常默认开启事务,或自动包裹 service 方法;开发者没意识到某次“只读查询”其实被套进了事务,结果本该并发的请求被串行化,还占着连接和锁。

MedPeer
MedPeer

AI驱动的一站式科研服务平台

下载
  • 明确区分“需要事务”和“只读查询”,用 SELECT ... LOCK IN SHARE MODEFOR UPDATE 前先确认必要性
  • START TRANSACTION READ ONLY 替代普通事务做纯读操作,减少 undo 日志开销
  • 检查框架配置,关闭不必要的自动事务包装(如 Spring 的 @Transactional 默认传播行为)

高并发下事务放大系统雪崩风险

一个慢事务拖住连接池,后续请求排队;若同时触发大量锁等待,可能引发连锁超时、连接耗尽、主从延迟飙升,甚至误判为数据库宕机。

  • 设置合理的 wait_timeoutinnodb_lock_wait_timeout,避免无限等待
  • 关键接口加入事务执行耗时监控(如 P99 > 200ms 就告警)
  • pt-killsys.innodb_lock_waits 视图主动 kill 异常长事务

事务是保障数据正确的利器,不是兜底工具。设计阶段就要想清楚:这笔操作是否真需要原子性?有没有更轻量的替代方案(如应用层幂等+最终一致性)?不复杂但容易忽略。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

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

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

315

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

270

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

363

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

363

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

80

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

63

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

62

2025.08.05

mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

654

2023.06.20

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 779人学习

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

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