如何在MySQL中查看当前连接的事务隔离级别与状态

落强姑娘_4843

落强姑娘_4843

2026-09-23

880人浏览

原创

mysql中查会话隔离级别优先用select @@transaction_isolation(8.0+),5.7及以下需用@@tx_isolation;全局级别须加@@global.前缀;真实运行时值需结合innodb_trx和performance_schema.variables_by_thread交叉验证。

如何在mysql中查看当前连接的事务隔离级别与状态

查当前会话隔离级别:先试 @@transaction_isolation,报错就换 @@tx_isolation

MySQL 8.0+ 默认用 SELECT @@transaction_isolation,返回值类似 'REPEATABLE-READ'(带单引号、全大写、短横线)。在 5.7 或更早版本执行这条会直接报 Unknown system variable 'transaction_isolation'。这时候必须切到兼容写法:SELECT @@tx_isolation。别指望自动适配——变量名不匹配就是硬报错,没有 fallback 逻辑。

这个值只反映连接初始化时继承或显式 SET SESSION 设定的值,不是事务运行时的真实快照。比如事务中执行了 SET TRANSACTION ISOLATION LEVEL READ COMMITTED,再查 @@transaction_isolation 还是原来那个值。

  • @@session.transaction_isolation@@transaction_isolation 等价,可互换
  • 权限受限账号下,SELECT @@... 可能因无 SELECT 权限失败,而 SHOW VARIABLES LIKE 'transaction_isolation' 只需 USAGE 权限,更稳妥
  • 返回值带单引号(如 'READ-COMMITTED'),脚本解析时注意字符串清洗,别直接当裸字符串比较

查全局默认隔离级别:必须加 @@global. 前缀

想确认新建立的连接默认用什么级别,得明确查全局变量:SELECT @@global.transaction_isolation(8.0+)或 SELECT @@global.tx_isolation(5.7-)。漏掉 @@global. 就还是查会话级,容易误判成“全局已生效”。

这个值只决定后续新建连接的初始设置,不影响已有连接。它和配置文件里写的 transaction-isolation = READ-COMMITTED 是一回事——但改了配置必须重启 MySQL 才生效;SET GLOBAL TRANSACTION ISOLATION LEVEL ... 在 8.0+ 已被移除,执行会报错。

  • 配置文件中变量名写成下划线(transaction_isolation)或大小写混用(Transaction-Isolation),MySQL 启动时会静默忽略,日志里可能只有 unknown variable 提示
  • SHOW GLOBAL VARIABLES LIKE 'transaction_isolation' 返回两列(Variable_nameValue),适合人工扫视;但字段顺序可能随版本微调,监控脚本建议坚持用 SELECT @@global...

看当前活跃事务:查 INNODB_TRX 表最直接

隔离级别只是上下文,真正要定位“正在跑什么事务”,得看 information_schema.INNODB_TRXSELECT * FROM information_schema.INNODB_TRX\G。它给出每个活跃事务的 trx_idtrx_state(如 RUNNINGLOCK WAIT)、trx_started 时间戳、对应线程 ID(trx_mysql_thread_id)以及正在执行的 SQL(trx_query)。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

这个视图是排查长事务、锁等待、事务卡死的第一手依据。注意它只包含 InnoDB 引擎的事务,MyISAM 不在此列。

  • 搭配 SHOW FULL PROCESSLIST,用 trx_mysql_thread_id 关联线程状态,能快速判断是“真执行中”还是“空闲 Sleep”
  • trx_state = 'LOCK WAIT' 说明该事务在等锁,下一步该查 INNODB_LOCK_WAITSINNODB_LOCKS
  • ORM(如 Django/SQLAlchemy)或连接池(如 HikariCP)常在建连后立即发 SET 语句覆盖隔离级别,光看 INNODB_TRXtrx_started 时间,未必能反映业务代码实际开启事务的时机

查其他连接的隔离级别:用 performance_schema.variables_by_thread

如果要审计多个连接各自的隔离级别(比如排查某条慢查询是否因隔离级别设错导致),不能只查自己的会话。MySQL 5.7+ 提供了 performance_schema.variables_by_thread 表,可关联线程 ID 查每个连接的实际设置:

SELECT p.ID AS process_id, p.USER, p.DB, v.VARIABLE_VALUE AS isolation_level
FROM information_schema.PROCESSLIST p
JOIN performance_schema.variables_by_thread v
  ON v.THREAD_ID = p.THREAD_ID
WHERE v.VARIABLE_NAME = 'transaction_isolation'
  AND p.COMMAND != 'Sleep';

这个查询能暴露 ORM 自动设的值、连接池预热时覆盖的值,甚至某些中间件悄悄下发的 SET 指令。但注意:performance_schema 默认可能未启用,需确认 performance_schema=ON 且相关 consumers 已打开。

  • 该表只在事务处于活跃态(非 Sleep)时才稳定可见变量值;空闲连接可能查不到或返回 NULL
  • 权限要求比 INNODB_TRX 高,需要 SELECT 权限 + PERFORMANCE_SCHEMA 访问权
  • 返回的 VARIABLE_VALUE 是字符串,格式与 SELECT @@... 一致,但注意它反映的是线程启动后最后一次 SET 的结果,不是连接池复用前的原始值

真实环境里,SELECT @@transaction_isolation 看到的往往只是“连接初始化快照”,而 ORM、连接池、中间件层层叠加的 SET 操作,可能早已在你执行第一条业务 SQL 前就改掉了它——别只信这个值,得结合 INNODB_TRX 和线程级变量交叉验证。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

3723

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

791

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

949

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

5501

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2483

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5480

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

7141

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

970

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

852

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 169人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 274人学习