在线修改事务隔离级别需区分会话级和全局级:SET SESSION仅影响当前连接后续事务,必须在事务开始前执行;SET GLOBAL只改变新连接默认值,需SUPER权限且不持久化;配置文件需在[mysqld]下用transaction-isolation='READ-COMMITTED'并重启生效。

能在线修改,但必须分清会话级和全局级——改错范围会导致预期外的行为。
SET SESSION TRANSACTION ISOLATION LEVEL 用法与限制
这是最常用也最安全的在线修改方式,只影响当前连接后续开启的事务。
- 必须在事务开始前执行,否则报错
Can’t change transaction isolation level when a transaction is active - 语法中
SESSION可省略,SET TRANSACTION ISOLATION LEVEL READ COMMITTED等价于带SESSION - 不支持动态切换正在运行的事务的隔离级别——哪怕事务还没 COMMIT,也不能中途改
- 示例:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;,执行后该连接下所有新事务都按此级别运行
SET GLOBAL transaction_isolation 生效逻辑
它改的是“新连接的默认值”,不是现有连接的运行时行为。
- 执行
SET GLOBAL transaction_isolation = 'READ-COMMITTED'后,已连上的老连接仍保持原有隔离级别,直到断开重连 - 需要
SUPER权限,普通应用账号通常无权执行 - MySQL 8.0+ 推荐用全大写加单引号写法:
'READ-COMMITTED';5.7 及更早版本可能还识别tx_isolation变量名,但已废弃 - 该设置不会持久化——服务重启后丢失,必须配合配置文件才真正永久生效
my.cnf 中 transaction-isolation 配置要点
这是唯一能让隔离级别“重启后仍生效”的方式,但格式错一点就静默失效。
- 必须写在
[mysqld]段下,且键名是transaction-isolation(短横线,不是下划线) - 值推荐写成
transaction-isolation = 'READ-COMMITTED':引号防空格解析错误,全大写避免大小写敏感问题 - 写成
transaction_isolation = READ-COMMITTED是无效的——MySQL 启动时直接忽略这行,不报错也不警告 - 改完必须重启 mysqld 进程,用
mysqladmin shutdown或系统服务命令,不能只 kill -9
READ-COMMITTED 和 REPEATABLE-READ 的实际差异点
别只看理论定义,关键看同一事务内多次查询是否“看到变化”。
-
REPEATABLE-READ(MySQL 默认):第一次SELECT后,后续同条件查询复用 MVCC 快照,哪怕其他事务已提交新数据 -
READ-COMMITTED:每次SELECT都读取最新已提交版本,所以会出现不可重复读,但不会脏读 - 幻读在两者中都可能发生,
REPEATABLE-READ仅靠间隙锁缓解,不等于完全杜绝;SERIALIZABLE才真正串行化,但代价极高 - 线上改隔离级别前,务必确认业务是否依赖“可重复读”语义——比如订单状态页多次刷新要显示一致结果,就不能贸然切到
READ-COMMITTED
最容易被忽略的是:全局配置改了但没重启,或者误用下划线写法导致配置无效,结果查 SELECT @@global.transaction_isolation 看着像生效了,实际新连接还是用默认值。


















