讲师中心 微信公众号
AI工具推荐 视频效率加速

mysql数据库的事务隔离级别与并发控制

老明吖_1629

老明吖_1629

发布时间:2026-02-04 08:45:10

|

618人浏览过

|

来源于php中文网

原创

MySQL默认隔离级别是REPEATABLE READ,通过Next-Key Locks与MVCC实现,快照读无幻读,当前读可能幻读;RC级每次快照读取最新版本,易发幻读;RU和SERIALIZABLE极少使用。

mysql数据库的事务隔离级别与并发控制

MySQL 默认隔离级别是 REPEATABLE READ,但它的实现方式和标准 SQL 不同

MySQL 的 REPEATABLE READ 并不靠锁住所有读取范围来防止幻读,而是用 Next-Key Locks(间隙锁 + 行锁)配合 MVCC 实现。这意味着:同一事务中多次 SELECT 看到的数据快照一致,但新插入的行是否可见,取决于是否落在被锁定的间隙里。

常见误解是认为 REPEATABLE READ 能完全避免幻读 —— 实际上,在「当前读」(如 SELECT ... FOR UPDATE、UPDATE、DELETE)下,间隙锁会阻止其他事务在范围内插入,从而抑制幻读;但在纯「快照读」下,新插入的行对本事务不可见,不是因为被锁住,而是因为 MVCC 只看到事务开始时已存在的版本。

  • READ COMMITTED 下每次快照读都重新获取最新已提交版本,所以不会复现「不可重复读」,但幻读更易发生(间隙锁在 RC 下只在唯一索引等少数场景启用)
  • READ UNCOMMITTED 几乎不用:可能读到未提交数据,SELECT 不加任何锁,性能高但业务逻辑极难保证
  • SERIALIZABLE 会让普通 SELECT 隐式加上 LOCK IN SHARE MODE,所有读写都串行化,开销大,通常只在极严苛审计场景才考虑

如何查看和修改当前会话或全局隔离级别

隔离级别是会话级变量,可动态调整,但需注意生效时机:修改后只影响后续语句,不影响已开启的事务。

SELECT @@transaction_isolation;
-- 返回类似:REPEATABLE-READ(MySQL 8.0+)或 TRANSACTION_ISOLATION(5.7)
<p>SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 需 SUPER 权限,且新连接才生效

注意:GLOBAL 设置不会改变当前已连接会话的级别;如果应用使用连接池,改全局后旧连接仍维持原级别,必须重启连接或显式 SET SESSION。

  • MySQL 5.7 使用 @@tx_isolation,8.0+ 统一为 @@transaction_isolation
  • 配置文件中设置:在 my.cnf 加 transaction-isolation = READ-COMMITTED(注意用短横线)
  • JDBC 连接串可指定:添加 &sessionVariables=transaction_isolation='READ-COMMITTED'

SELECT ... FOR UPDATE 和 SELECT ... LOCK IN SHARE MODE 的锁行为差异

这两者都触发「当前读」,绕过 MVCC 快照,直接访问最新行并加锁,但锁类型和兼容性不同:

  • FOR UPDATE 在符合条件的记录上加 X 锁(排他锁),同时在扫描范围加 Gap Lock(除非唯一索引等效精确匹配)
  • LOCK IN SHARE MODE 加 S 锁(共享锁),允许其他事务加 S 锁,但阻塞 X 锁;同样有间隙锁行为
  • 若查询条件无索引,MySQL 会退化为全表扫描 + 全表记录加锁,极易引发锁等待甚至死锁

典型陷阱:执行 SELECT * FROM t WHERE name = 'foo' FOR UPDATE,但 name 列没有索引 → 锁住整张表所有行,而不是仅匹配行。

幻读到底在什么情况下会发生?

幻读指「同一事务中,前后两次相同范围的 SELECT 返回行数不同」。它是否发生,取决于读类型和隔离级别:

  • 在 REPEATABLE READ 下,快照读(普通 SELECT)不会出现幻读 —— 因为始终读取事务启动时的快照
  • 但在当前读下(如 SELECT ... FOR UPDATE),如果另一个事务在间隙中插入了新行,本事务再次执行相同当前读时会看到新行 → 这就是幻读
  • READ COMMITTED 下,快照读每次取最新已提交版本,所以不仅可能幻读,还可能出现不可重复读

真正难处理的是「基于幻读做业务判断」的场景,比如先查有没有订单,再插入 —— 即使用了 SELECT ... FOR UPDATE,若没锁住对应间隙,仍可能被并发插入打破逻辑。这时候得靠唯一约束或应用层分布式锁兜底。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

4763

2023.10.12

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

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

971

2023.10.27

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

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

1249

2024.02.23

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

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

6761

2024.03.06

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

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

3483

2024.03.06

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

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

6740

2024.04.07

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

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

9341

2024.04.29

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

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

1270

2024.04.29

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

热门下载

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

精品课程

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

共1课时 | 194人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn