如何检测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
相关产品推荐
相关产品推荐

