mysql中查当前会话隔离级别应使用select @@tx_isolation(5.7.20+标准写法,8.0+等价于@@session.transaction_isolation),而非不存在的select-transaction_isolation;全局级别需查@@global.transaction_isolation,且set global修改不影响已有会话。

直接查 @@tx_isolation,不是 select-transaction_isolation —— 这个写法根本不存在,会报错。
查当前会话的隔离级别用 @@tx_isolation
MySQL 从 5.7.20 开始,@@tx_isolation 是标准变量名,返回当前 session 的实际隔离级别:
SELECT @@tx_isolation;
结果类似:REPEATABLE-READ 或 READ-COMMITTED。注意大小写和连字符格式是固定的。
- 这个值只反映当前连接的设置,不受其他会话影响
- 如果没显式设置过,它就等于该连接启动时继承的
@@session.tx_isolation值 - 在 MySQL 8.0+ 中,
@@tx_isolation是@@session.transaction_isolation的别名,二者等价
查全局默认隔离级别用 @@global.transaction_isolation
想看新连接默认用什么级别,必须查全局变量:
SELECT @@global.transaction_isolation;
不要用 @@global.tx_isolation —— 它在 MySQL 8.0+ 已被弃用,虽然兼容但不推荐。
- 修改全局级别需 SUPER 权限:
SET GLOBAL transaction_isolation = 'READ-COMMITTED'; - 改完后,**已存在的连接不会变**,只影响后续新建的连接
- 重启 MySQL 后,全局设置会丢失,除非写进配置文件
my.cnf的[mysqld]段里
为什么 select-transaction_isolation 不行
这是把 SQL 语句语法和变量名混在一起了。MySQL 中:
-
SELECT是关键字,后面必须跟表达式或变量,不能跟带连字符的字符串 -
transaction_isolation是系统变量名,前面必须加@(单个)或@@(会话/全局) - 写成
SELECT transaction_isolation;会被当成查一个叫transaction_isolation的列或别名,报Unknown column - 写成
SELECT 'transaction_isolation';只是返回字面量字符串,毫无意义
容易忽略的细节
MySQL 8.0.3 之后,READ-UNCOMMITTED 和 SERIALIZABLE 在某些存储引擎(如 InnoDB)下行为有隐式调整;而 REPEATABLE-READ 虽然是默认值,但它对 UPDATE ... WHERE 的加锁范围、是否触发间隙锁,都依赖具体 SQL 和索引结构——光知道级别名字,不结合执行计划看锁,照样踩坑。











