mysql中查当前会话隔离级别用select @@transaction_isolation,返回repeatable-read等值;查全局默认值用select @@global.transaction_isolation;动态修改需用set transaction isolation level,且须在事务开始后、首条dml前执行。

查当前会话的隔离级别用 SELECT @@transaction_isolation
MySQL 8.0+ 默认返回类似 REPEATABLE-READ 的字符串值,5.7 及更早版本可能返回带引号的字符串(如 'REPEATABLE-READ'),本质一致。这个变量只反映当前连接的设置,不涉及全局或其他会话。
- 执行前确保已连接到目标数据库,否则报错
ERROR 1046 (3D000): No database selected(但不影响变量读取,只是提示) - 如果返回空或
NULL,大概率是权限不足(SELECT权限被限制在特定库),换有USAGE或SELECT全局权限的账号重试 - 该语句不加
FROM、不需表名,写成SELECT @@tx_isolation在旧版本也行(但已被弃用,8.0 起警告)
查全局默认隔离级别用 SELECT @@global.transaction_isolation
这个值决定新建立连接的默认隔离级别,和当前会话无关。修改它需要 SUPER 或 SYSTEM_VARIABLES_ADMIN 权限,普通应用账号通常没这权限。
- 线上环境改之前务必确认:所有客户端是否兼容新级别(比如把
REPEATABLE-READ改成READ-COMMITTED,可能暴露幻读,但减少锁竞争) -
@@global.前缀不能省,漏掉就变成查会话级,容易误判 - 配置文件里设的
transaction-isolation=READ-COMMITTED启动后,这里才显示对应值;如果没配,就按 MySQL 版本默认(5.7 是REPEATABLE-READ,8.0 也是)
事务中动态改隔离级别必须用 SET TRANSACTION ISOLATION LEVEL
SELECT @@transaction_isolation 看不到运行时临时改的效果,因为它是只读变量;真正生效靠的是 SET 语句,且必须在 BEGIN 或 START TRANSACTION 之后、第一条 DML 之前执行。
- 错误写法:
SET @@transaction_isolation = 'READ-COMMITTED'—— 这改的是会话变量,但 MySQL 不允许直接赋值给这个系统变量 - 正确写法:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED(注意没等号、LEVEL 不可省) - 如果在事务中间执行,MySQL 会报错
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress - 这种设置只对当前事务有效,事务结束自动还原为会话默认值
不同版本返回格式差异导致脚本出错
MySQL 5.7 返回带单引号的字符串('REPEATABLE-READ'),8.0+ 返回无引号(REPEATABLE-READ)。用正则或字符串截取做判断的监控脚本,容易在这里翻车。
- 安全比对方式:用
TRIM(BOTH '\'' FROM @@transaction_isolation)统一去引号再比较 - Docker 或云数据库(如阿里云 RDS)可能打了补丁,返回格式和官方文档不一致,别硬背“应该是什么”,先
SELECT看一眼 - 程序里解析时建议用
INSTR()或=判断子串,别依赖首尾字符位置
@@transaction_isolation 就只是个摆设。










