0

0

mysql事务隔离级别如何选择_mysql并发控制策略

P粉602998670

P粉602998670

发布时间:2026-03-15 10:02:31

|

389人浏览过

|

来源于php中文网

原创

READ COMMITTED 是多数业务的合理起点,它避免间隙锁、降低死锁风险,适用于允许不可重复读的场景;仅当强一致性必需(如银行余额校验)时才用 REPEATABLE READ;SERIALIZABLE 基本不用。

mysql事务隔离级别如何选择_mysql并发控制策略

READ COMMITTED 是大多数业务的合理起点

MySQL 默认隔离级别是 REPEATABLE READ,但它在可重复读语义下使用间隙锁(gap lock)来防止幻读,这会显著增加锁冲突概率,尤其在高并发 INSERT ... SELECT 或范围 UPDATE 场景下容易触发死锁或锁等待超时(Lock wait timeout exceeded)。而 READ COMMITTED 下只对已存在的记录加行锁,不加间隙锁,锁粒度更小、并发更高。

适用场景包括:电商订单支付状态更新、用户积分变动、日志类写入等——只要业务能接受“同一事务中两次相同 SELECT 可能返回不同结果”(即允许不可重复读),就值得切换。

  • 确认当前级别:SELECT @@transaction_isolation;
  • 临时修改会话级别:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  • 全局修改需谨慎:在 my.cnf 中设 transaction_isolation = 'READ-COMMITTED',但要同步评估所有存量 SQL 是否依赖可重复读语义(如基于首次查询结果做二次判断的逻辑)

什么时候必须用 REPEATABLE READ

只有当业务逻辑明确依赖“事务内多次读取一致”且无法通过应用层加锁或重试规避时,才保留 REPEATABLE READ。典型例子是银行转账中的余额校验:先查账户余额,再判断是否足够扣款,整个过程不能被其他事务的中间更新干扰。

但要注意:MySQL 的 REPEATABLE READ 并非标准 SQL 实现,它用 MVCC + 间隙锁模拟可重复读,副作用是范围查询(如 SELECT * FROM t WHERE id > 100)会锁住 100 之后的所有间隙,哪怕那些行还不存在。这常导致插入新记录时被阻塞。

  • 避免全表扫描式范围条件,尽量让 WHERE 走索引,缩小间隙锁覆盖范围
  • 如果只是想防止幻读但不需要强一致性,考虑用 SELECT ... FOR UPDATE 显式加锁替代隔离级别依赖
  • 升级到 MySQL 8.0+ 后,可结合 innodb_lock_wait_timeout 和应用层重试,降低对 REPEATABLE READ 的强依赖

Serializable 基本不用,除非你真需要串行化

SERIALIZABLE 会让所有普通 SELECT 隐式转为 SELECT ... LOCK IN SHARE MODE,相当于给每条读语句加共享锁。它彻底消除幻读,但也几乎消灭并发——读写互斥、写写互斥,QPS 断崖式下跌。线上服务极少启用。

小微助手
小微助手

微信推出的一款专注于提升桌面效率的助手型AI工具

下载

真正需要串行执行的逻辑(如库存扣减+生成单号+写日志这一整套),应该由应用层通过分布式锁或数据库唯一约束(如用 INSERT IGNOREON DUPLICATE KEY UPDATE)控制,而不是靠隔离级别硬扛。

  • 测试阶段偶尔开启用于复现竞态问题,但上线前务必关掉
  • 如果误开,监控会明显看到 Innodb_row_lock_waitsThreads_running 异常升高
  • 它不能替代应用层幂等设计,反而会掩盖真实的数据竞争点

别忽略 autocommit 和显式事务边界的影响

隔离级别只在事务内生效。很多并发问题其实不是隔离级别选错,而是没正确开启事务:autocommit=1 下每个语句自成事务,SELECT 看到的是语句开始时刻的快照,但两次 SELECT 之间可能已被其他事务修改——这和隔离级别无关,是事务使用方式问题。

例如库存扣减逻辑写成两个独立语句:SELECT stock FROM item WHERE id=123; → 应用判断够用 → UPDATE item SET stock=stock-1 WHERE id=123;,即使在 REPEATABLE READ 下也存在竞态。必须包在 BEGIN; ... COMMIT; 中,并配合 SELECT ... FOR UPDATE

  • 检查 autocommit 状态:SELECT @@autocommit;
  • 批量操作务必显式 BEGIN,避免隐式事务拆分
  • ORM 框架(如 MyBatis、Django ORM)默认事务行为差异大,需确认其 @Transactional 注解实际生效范围

实际调优时,隔离级别只是并发控制拼图的一块。真正棘手的往往是长事务、未提交的写锁、缺乏索引导致的锁升级,或者应用层把本该原子的操作拆成了多步。先看 SHOW ENGINE INNODB STATUS\G 里的 TRANSACTIONSLOCK WAIT 段,比盲目调隔离级别管用得多。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的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,提供了直观易用的用户界面等等。

1135

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的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

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

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

2214

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数据库的相关内容,可以阅读本专题下面的文章。

1723

2024.04.07

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

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

586

2024.04.29

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

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

441

2024.04.29

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

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

精品课程

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

共48课时 | 2.6万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 850人学习

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

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