2014-10-29 111 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