【问题标题】:How do I determine if I have uncommitted writes in a MySQL transaction?如何确定我在 MySQL 事务中是否有未提交的写入?
【发布时间】:2016-03-22 01:28:31
【问题描述】:

我正在处理一个非常复杂的代码库,并希望对它如何与 MySQL 一起工作进行一些反思。 (请注意,我使用的是 InnoDB)。

具体来说,在我正在编写的方法中,我希望确定在其打开的数据库连接中是否有任何未完成的(未提交的)写入。

是否有任何 MySQL 命令或其他方法来检测是否有未提交的写入? (或换一种说法,确定 COMMIT 是否不会进行任何修改)。

【问题讨论】:

    标签: mysql innodb


    【解决方案1】:

    这是一个非常有趣的问题。我认为没有明确的方法可以确定发出提交是否会对您正在运行的会话产生影响。

    您可以看到带有show innodb statusshow engine innodb status 的事务,但我认为您不能对这些事务发出提交。

    information_schema 中的INNODB_TRX 表将显示当前正在执行的事务:https://dev.mysql.com/doc/refman/5.5/en/innodb-trx-table.html,而且您无法强制提交它们。您可以通过终止相关进程来回滚它们。

    如果您在存储过程中使用START TRANSACTION 运行事务,则可以手动处理提交和回滚。您甚至可以将set autocommit 设置为 0 来控制何时回滚和何时提交。

    【讨论】:

    • 感谢您的建议。执行 SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID() 正是我想要的。 (支持stackoverflow.com/questions/26620966/…)。但是,当我进行插入时,该表似乎不会立即更新;在我的测试中似乎需要大约 100 毫秒。我对延迟很好,但我不相信任意睡眠。是否有一个 mysql 命令在此表同步之前阻塞?
    • 我不太了解 MySQL 内部结构。您可能必须深入研究其源代码才能弄清楚这一点。源代码在 GitHub 上。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多