最直接的方式是先执行 select @@transaction_isolation(mysql 8.0+),若报错则改用 select @@tx_isolation(5.7 及更早);该变量反映会话初始化值而非事务内临时设置,真正生效级别由事务启动时确定。

SELECT @@transaction_isolation 是最直接的方式,但必须先确认 MySQL 版本 —— 8.0+ 用这个,5.7 及更早版本得换 SELECT @@tx_isolation,否则报错。
查当前会话该用哪个变量名?
MySQL 8.0 开始废弃 tx_isolation,统一用 transaction_isolation;5.7.20 之前只认 tx_isolation。混用会触发 Unknown system variable 错误。
- 优先执行
SELECT @@transaction_isolation; - 如果报错,立刻改用
SELECT @@tx_isolation; - 返回值是字符串,如
REPEATABLE-READ(8.0+)或'REPEATABLE-READ'(5.7,带单引号),脚本解析时要注意引号差异
为什么 SELECT @@transaction_isolation 看不到事务中临时改的级别?
这个变量反映的是会话初始化时继承或显式 SET SESSION 设定的值,不是运行时快照。事务内执行 SET TRANSACTION ISOLATION LEVEL READ COMMITTED 后,SELECT @@transaction_isolation 仍返回会话默认值。
- 真正生效的隔离级别,由事务启动那一刻决定(即
BEGIN或第一条 DML 时确定) -
SET TRANSACTION ISOLATION LEVEL必须在BEGIN之后、首条 DML 之前执行才有效 - ORM(如 Django、SQLAlchemy)常在连接建立时自动设级别,手动
SET可能被后续覆盖
权限受限时怎么安全查?
某些账号没有 SELECT 权限,执行 SELECT @@... 会失败;SHOW VARIABLES 只需 USAGE 权限,更稳妥。
- 查会话级:
SHOW VARIABLES LIKE 'transaction_isolation'; - 查全局级:
SHOW GLOBAL VARIABLES LIKE 'transaction_isolation'; - 注意:
SHOW VARIABLES返回两列(Variable_name和Value),适合人工扫视,但不推荐用于监控脚本——字段顺序和列名可能随版本微调
怎么确认新连接默认用什么级别?
会话级变量不能代表全局默认值。想查新连接的初始设置,必须加 @@global. 前缀,否则还是查当前会话。
- 执行
SELECT @@global.transaction_isolation;(8.0+)或SELECT @@global.tx_isolation;(5.7) - 这个值不受当前会话影响,只决定后续新建连接的初始值
- 配置文件里写了
transaction-isolation = READ-COMMITTED却没生效?检查 MySQL 是否真读了那个my.cnf,比如启动时指定了--defaults-file











