2010-07-03 66 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

相關問題