查看当前隔离级别最可靠的方式是执行 SELECT @@transaction_isolation;MySQL 5.7 可用 @@tx_isolation(已弃用),8.0+ 必须用 @@transaction_isolation,全局值查 @@global.transaction_isolation。

MySQL 中设置事务隔离级别为 READ COMMITTED,最稳妥的方式是「配置文件 + 会话级显式设置」双保险。只改会话级可能被 ORM 或连接池覆盖;只改配置文件又无法覆盖已有连接——得看你要解决什么问题。
查看当前隔离级别用哪个变量?
MySQL 5.7 和 8.0+ 的变量名不一致,直接查 @@transaction_isolation 最可靠:
- MySQL 5.7 及更早:
SELECT @@tx_isolation;还能用,但已弃用 - MySQL 8.0+:必须用
SELECT @@transaction_isolation;,@@tx_isolation已被移除 - 查全局默认值:用
SELECT @@global.transaction_isolation;
如果返回 REPEATABLE-READ(带短横线),说明当前是默认的可重复读,还没生效你设的 READ COMMITTED。
会话级设置:为什么 SET SESSION 不一定管用?
很多框架(比如 Spring Boot + MyBatis)在获取连接后会主动执行 SET SESSION TRANSACTION ISOLATION LEVEL ...,把你手动设的覆盖掉。所以光在客户端敲:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
——只对当前这个空闲连接有效,一旦应用代码开启事务,很可能又被重置。
MySQL 数据库管理技能,能够通过自然语言查询和管理数据库,支持 SELECT/INSERT/UPDATE/DELETE、表管理、备份恢复等操作。当用户提及 MySQL、数据库查询、建表或数据备份时使用此技能。
- Spring 中需在
@Transactional(isolation = Isolation.READ_COMMITTED)显式声明 - Druid 连接池可通过
connection-init-sql配置项注入初始化语句 - 若用 JDBC URL,可加参数:
?sessionVariables=transaction_isolation=READ-COMMITTED(注意是短横线,不是空格)
配置文件设置:transaction-isolation 值要写成什么格式?
在 my.cnf 或 my.ini 的 [mysqld] 段下写:
[mysqld] transaction-isolation = READ-COMMITTED
注意三点:
- 必须用短横线
READ-COMMITTED,不能写成READ COMMITTED或read_committed,否则 MySQL 启动失败或静默忽略 - 该配置只影响新建立的连接,已存在的连接(包括正在运行的会话)不受影响
- 修改后必须重启 MySQL 服务,
SET GLOBAL无法持久化到磁盘,且重启后丢失
验证是否真正生效的坑点
别只信 SELECT @@transaction_isolation; 返回值。它只反映“当前会话的当前设置”,不代表事务行为真按这个级别跑。要验证,得做实际并发测试:
- 开两个客户端 A 和 B,都设为
READ COMMITTED - A 执行
START TRANSACTION; SELECT * FROM t WHERE id = 1; - B 修改同一行并
COMMIT - A 再查一次 —— 应看到新值(即“不可重复读”发生),这才是
READ COMMITTED的正确表现 - 如果两次查询结果一样,可能是 A 实际还在
REPEATABLE READ下(比如连接池没读取配置)
真正麻烦的不是怎么设,而是设完之后没人去核对它在真实事务流里有没有被绕过——ORM、中间件、连接复用,全可能悄悄重置隔离级别。










