2010-07-03 64 views
8

我开始交易。我可以在InnoDB事务中检索挂起的查询吗?

然后我需要回滚它。

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

(PS:当然的我可以事先登录他们;我在想,如果这可以在一个更“自然”的方式来完成)

+0

我认为自然的方法是事先记录它们。如果你不知道交易在做什么,你怎么知道你想要回滚? – 2010-10-02 02:04:16

回答

1

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

2

如果你在最近的MySQL 5.1中,这应该工作:

SHOW ENGINE INNODB状态包括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选择@PROGRESS以查明事务在它之前走了多远打了一个回滚。

+0

不幸'错误1227(42000):访问被拒绝;您需要SUPER权限才能执行此操作:( – 2010-07-20 10:07:06

+0

此外,无论如何不存在任何查询:/ – 2010-07-20 10:14:44

+0

如果您的查询速度很快,可能会因此方法过快而失效,您可以按照Marcus建议的方式尝试InnoDB监视器,但如果您的查询速度很快,则可能需要将监视间隔设置得非常小! – 2010-07-20 12:45:08

相关问题