2014-10-29 115 views
0

MySQL 5.5可以獲取當前的事務ID嗎?類似...MySQL 5.5:獲取當前的事務ID?

BEGIN; 
SELECT CURRENT_XID(); -- foo 
... 
SELECT CURRENT_XID(); -- also foo 
ROLLBACK; 

SELECT CURRENT_XID(); -- NOT foo 

實際值並不重要,只要我可以獲得某個唯一標識符,該標識符將始終在整個同一事務中返回相同的值。

回答

2

有甘德在http://dev.mysql.com/doc/refman/5.5/en/innodb-trx-table.html

有沒有簡單的函數返回的信息,但你可以在該表發出特殊查詢找,獲取TRANSACTION_ID

+0

'SELECT count(*)FROM INFORMATION_SCHEMA.INNODB_TRX' returns'0' – 2014-10-29 01:09:53

+1

當事務使用非只讀SQL命令時,似乎該事務只在'INNODB_TRX'中註冊。有點討厭,但這應該工作... – 2014-10-29 01:13:49

+0

你是否首先開始交易? – winmutt 2014-10-29 01:13:53

1

這裏是一個壞的解決方案:

CREATE FUNCTION CURRENT_XID() RETURNS VARCHAR(18) 
BEGIN 
    RETURN (SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX 
      WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID()); 
END 
  1. 返回NULL如果你只是做只讀操作的事務內。
  2. 最重要的是INNODB_TRX不與事務同步。因此,如果您在交易結束後立即致電CURRENT_XID(),您將獲得一筆價值回報,但稍後等待一秒鐘,然後運行它,您將獲得NULL
+0

感謝您的信息。在這個表更新之前,有沒有辦法讓mysql「阻塞」? (我正在做這個編程,並希望不只是做一個time.sleep()。請參閱http://stackoverflow.com/questions/34303079/how-do-i-determine-if-i-have-uncommitted-writes -in-a-mysql-transaction – UsAaR33 2015-12-16 08:16:14

+0

您是否試圖在不中斷數據庫的情況下檢查是否有未完成的事務,或者您希望將數據庫在短時間內置於只讀狀態? – 2015-12-17 00:59:54

+0

前者(檢查未完成的事務) – UsAaR33 2015-12-17 07:51:11