MySQL 8.0+ 应使用 @@transaction_isolation 替代已移除的 @@tx_isolation,查询当前会话值用 SELECT @@transaction_isolation,全局值用 @@global.transaction_isolation。
MySQL 8.0+ 查不到 @@tx_isolation?用这个替代
mysql 8.0 开始,@@tx_isolation 已被弃用并移除,直接执行会报错 unknown system variable 'tx_isolation'。这不是你权限或配置的问题,是官方彻底删了这个变量。
正确做法是查 @@transaction_isolation:
SELECT @@transaction_isolation;
- 返回值形如
'REPEATABLE-READ'、'READ-COMMITTED'等,大小写敏感 - 该变量在会话级和全局级都存在,查的是当前会话的值
- 如果想查全局默认值,用
SELECT @@global.transaction_isolation;
MySQL 5.7 及更早版本还能用 @@tx_isolation 吗?
能,但要注意格式差异:MySQL 5.7 返回的是带引擎前缀的字符串,比如 'REPEATABLEREAD'(中间无短横)或 'SERIALIZABLE',而 MySQL 8.0+ 统一为带短横的标准写法('REPEATABLE-READ')。
这意味着跨版本写自动化脚本时,不能简单靠字符串匹配判断隔离级别,得做兼容处理:
-
REPEATABLEREAD→ 对应REPEATABLE-READ -
READCOMMITTED→ 对应READ-COMMITTED -
READUNCOMMITTED→ 对应READ-UNCOMMITTED
为什么改名?和 SET TRANSACTION ISOLATION LEVEL 有啥关系
改名是为了对齐 SQL 标准术语,transaction_isolation 是标准系统变量名,tx_isolation 是 MySQL 旧别名。两者指向同一底层状态,只是变量名不同。
设置隔离级别时,命令本身没变:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
但设置后验证,必须用新变量名:
- ✅ 正确:
SELECT @@transaction_isolation; - ❌ 报错:
SELECT @@tx_isolation;(8.0+)
应用连接池里查出来一直是 REPEATABLE-READ?别急着怀疑代码
很多 ORM 或连接池(如 HikariCP、Druid)会在连接初始化时显式设置隔离级别,覆盖服务端默认值。即使你没在代码里调 setTransactionIsolation(),也可能被连接池的 connection-init-sql 或默认配置悄悄改了。
排查步骤:
- 先确认 MySQL 实例默认值:
SELECT @@global.transaction_isolation; - 再确认连接建立后立刻查:
SELECT @@transaction_isolation;(在业务 SQL 前加一句) - 检查连接池配置中是否含
transaction-isolation或初始化 SQL
最易忽略的一点:事务一旦开始(比如执行了第一条 SELECT 或 UPDATE),隔离级别就已锁定,后续改 @@transaction_isolation 不生效——必须在事务外、新会话里设。










