【问题标题】:Getting the current transaction ID with MySQL使用 MySQL 获取当前事务 ID
【发布时间】:2014-12-24 14:28:54
【问题描述】:

MySQL 5.5 是否可以获取当前事务 ID?有点像...

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

SELECT CURRENT_XID(); -- NOT foo

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

【问题讨论】:

    标签: mysql transactions mariadb innodb identifier


    【解决方案1】:

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

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

    【讨论】:

    • SELECT count(*) FROM INFORMATION_SCHEMA.INNODB_TRX 返回0
    • 当事务使用非只读SQL命令时,事务似乎只注册在INNODB_TRX。有点烦人,但这应该可以...
    • 你先开始交易了吗?
    • 是的,它不够优雅。
    • 如果您没有显式使用BEGIN,或者至少应该使用,则暗示交易。我不相信 MySQL 能胜任任何事情。
    【解决方案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

    【讨论】:

    • 感谢您的信息。在更新此表之前,mysql中有没有办法“阻止”? (我正在以编程方式执行此操作,并且希望不只是执行 time.sleep()。请参阅stackoverflow.com/questions/34303079/…
    • 您是要在不中断数据库的情况下检查是否有未完成的事务,还是希望将数据库短时间置于只读状态?
    • 前者(检查是否未完成交易)
    • 我不相信有什么超级可靠的方法,除了查看innodb状态和解析文本。
    【解决方案3】:

    在使用 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 仅分配给读写事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多