使用MySQL获取当前事务ID

时间:2014-10-29 00:39:12

标签: mysql transactions mariadb innodb identifier

MySQL 5.5是否可以获取当前的交易ID?有点像...

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

SELECT CURRENT_XID(); -- NOT foo

实际值并不重要,只要我能获得一些唯一的标识符,它将始终在同一事务中返回相同的值。

3 个答案:

答案 0 :(得分:2)

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

抱怨

没有简单的函数可以返回该信息,但您可以在该表中发出特殊查询查找并获取transaction_id

答案 1 :(得分:2)

这是一个糟糕的解决方案:

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

答案 2 :(得分:0)

在使用MySQL或MariaDB时,您可以执行以下SQL查询以获取当前的交易ID:

SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()

information_schema目录中的innodb_trx视图提供了有关当前正在运行的数据库事务的信息。由于我们的系统中可以运行多个事务,因此我们需要通过将会话或数据库连接标识符与当前正在运行的会话进行匹配来过滤事务行。

请注意,从MySQL 5.6开始,只有读写事务才会获得事务标识符。

由于分配事务ID具有给定的开销,因此只读事务将跳过此过程。只读事务优化在MariaDB中的工作方式相同,这意味着仅将事务ID分配给读写事务。

有关更多详细信息,请查看this article