我可以在InnoDB交易期间检索待处理的查询吗?

时间:2010-07-03 16:44:19

标签: mysql logging innodb transactions

我开始交易。

然后我需要回滚它。

我可以以某种方式获得以这种方式“丢弃”的查询列表吗?

(ps:当然我可以事先记录下来;我想知道这是否可以用更“自然”的方式完成)

2 个答案:

答案 0 :(得分:2)

如果您使用的是最新的MySQL 5.1,则应该可以使用:

SHOW ENGINE INNODB STATUS包含InnoDB引擎的活动事务列表。每个都以事务ID和进程ID为前缀,看起来有点像这样:

---TRANSACTION 0 290328284, ACTIVE 0 sec, process no 3195, OS thread id
34831 rollback of SQL statement
MySQL thread id 18272
<query may be here>

MySQL线程ID将对应于会话的CONNECTION_ID(),您可以从SHOW FULL PROCESSLIST或information_schema.processlist获取,因此您可以确定哪个事务是您的。你必须解析文本,然后解析出来的问题(如果存在的话)。

如果这还不够,你可以在每个ROLLBACK语句之前尝试SET @PROGRESS = @PROGRESS + 1之类的东西,然后在查询结束时从DUAL中选择SELECT @PROGRESS,以找出事务在命中之前已经走了多远回滚。

答案 1 :(得分:1)

如果您正在使用InnoDB,请查看InnoDB monitor和stderr。我认为最佳做法是将它们存储在应用程序(服务器)中,因为它不依赖于平台。