查看隔离级别需分别查会话和全局:select @@session.transaction_isolation, @@global.transaction_isolation;会话级修改须在start transaction前执行;全局修改需配置my.cnf并重启,set global不持久化;repeatable-read是innodb默认,慎改全局。

查看当前全局和会话隔离级别必须分开查
直接执行 SELECT @@transaction_isolation 只返回会话级值,它可能已被应用或连接池动态覆盖;真正代表 MySQL 启动默认配置的是 SELECT @@global.transaction_isolation。旧版本(如 5.7)还可能用 tx_isolation 变量名,所以稳妥做法是两条都查:SELECT @@session.transaction_isolation, @@global.transaction_isolation;
如果任一字段返回 NULL 或空字符串,不是“没设置”,而是配置语法错误或未生效。
会话级修改必须在 START TRANSACTION 之前执行
这是最常踩的坑:事务一旦开启,再执行 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED 会立刻报错:Can’t change transaction isolation level when a transaction is active。ORM 框架(比如 Spring 的 @Transactional)常自动开启事务,导致后续 SET 失效。
可行路径包括:
- 在连接池初始化时通过
initSql配置项执行 SET(如 HikariCP 的connection-init-sql) - 在业务代码显式调用
START TRANSACTION前设置 - 避免在长连接中反复切换,尤其连接复用场景下容易残留旧级别
全局修改需改配置文件并重启,SET GLOBAL 不持久化
SET GLOBAL transaction_isolation = 'READ-COMMITTED' 立即生效,但只影响后续新建连接,已有连接保持原会话级别。更重要的是:该命令不写入配置文件,MySQL 重启后失效。
要永久生效,必须编辑 my.cnf(Linux)或 my.ini(Windows),在 [mysqld] 段落下添加:
transaction-isolation = READ-COMMITTED
注意格式是连字符(READ-COMMITTED),不是下划线或空格;大小写不敏感,但值必须拼写正确。改完必须重启 MySQL 服务,否则不加载。
REPEATABLE-READ 是 InnoDB 默认,别轻易全局改
MySQL 5.1+ 的 InnoDB 引擎默认就是 REPEATABLE-READ,它通过 MVCC + 间隙锁在多数场景下平衡了一致性与性能。全局改成 READ-COMMITTED 虽能降低锁竞争,但会引入不可重复读——比如同一事务内两次查用户余额得到不同结果。除非明确业务能容忍这点(如商品详情页、日志统计),否则建议只在特定会话中按需调整,而非一刀切改全局。











