You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Percona数据库中正在运行的事务

在MariaDB环境中可通过以下3条语句判断当前会话是否处于事务中,执行后均会返回值1:

START TRANSACTION;

SELECT @@in_transaction;

SELECT variable_value FROM information_schema.session_variables WHERE variable_name = 'in_transaction';

SELECT session_value FROM information_schema.system_variables WHERE variable_name = 'in_transaction';

但以上语句在Percona 8.0.22-13版本中全部无法生效,原因和对应解决方法如下:

原因说明

MariaDB 独有的in_transaction会话变量、information_schema.session_variables/information_schema.system_variables表的对应字段设计,并没有被Percona Server for MySQL 8.0 继承,Percona 8.0 完全对齐上游MySQL 8.0的功能逻辑,没有内置in_transaction相关变量,因此原检测语句全部失效。

可用的检测方案

检测当前会话是否处于活跃事务

直接查询原生支持的会话状态变量即可,行为和MariaDB的@@in_transaction完全一致,返回1代表当前会话存在未结束的事务,返回0代表不在事务中:

START TRANSACTION;
SELECT @@transaction_is_active;

检测实例内所有正在运行的活跃事务

查询InnoDB引擎提供的事务状态表即可,返回结果的每一行对应一个正在运行的活跃事务,结果为空则代表当前没有运行中的事务:

SELECT * FROM information_schema.INNODB_TRX;

你可以通过这个表的字段获取事务的启动时间、执行的SQL、持有的锁、修改的行数等详细信息,比如筛选运行时间超过N秒的长事务、判断事务是否为只读事务等。

补充说明

  • 不要用@@autocommit的值判断是否在事务中:即使自动提交关闭,只要当前会话没有开启未结束的事务,@@transaction_is_active依然会返回0。
  • 空事务(执行START TRANSACTION后没有执行任何SQL的事务)也会被@@transaction_is_active识别为活跃事务,如果需要排除空事务,可以结合INNODB_TRX表的trx_rows_modified字段判断,字段值大于0代表事务已经执行过写操作。

内容的提问来源于stack exchange,提问作者27cm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:45:40