我开始交易。
然后我需要回滚它。
我可以以某种方式获得以这种方式“丢弃”的查询列表吗?
(ps:当然我可以事先记录下来;我想知道这是否可以用更“自然”的方式完成)
答案 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。我认为最佳做法是将它们存储在应用程序(服务器)中,因为它不依赖于平台。