【问题标题】:what happens with auto commit is disabled and there is never a rollback?禁用自动提交并且永远不会回滚会发生什么?
【发布时间】:2012-02-14 21:31:42
【问题描述】:

所以我继承了一个大型 c++ 代码库,它做了很多 mysql 工作。 代码总是禁用自动提交,并且往往具有如下所示的功能:

int function() {
    if(mysql_real_query(conn, ...)) {
        return -1;
    }

    if(mysql_real_query(conn, ...)) {
        return -1;
    }

    mysql_commit(conn);
    return 0;
}

显然,这里的意图是只有在查询成功时才会提交。但是,如果其中一个不是,会发生什么?最终,mysql连接正确关闭,但代码中没有回滚。

所以当它关闭时,它基本上会提交任何成功的更改吗?还是会像什么都没发生一样回滚?

我的直觉是,如果第二个查询失败,为了“撤消”成功的第一个查询,回滚是有意义的。所以这个函数最终是事务性的。

当然,我觉得这代码本来应该打破,因为以后其他MySQL代码可以做一个提交留下的东西在一个“怪异”的状态,如果一些以前的工作失败。但在我改变程序的行为之前,我想确保我理解当前的行为是什么。

【问题讨论】:

  • 很容易测试。启动事务,执行一些操作,然后在不断开连接的情况下终止程序 - 查看更改是否已提交/

标签: c++ mysql rollback autocommit


【解决方案1】:

正如 Marc B 所说,这实际上很容易测试。我希望有人能够指出权威来源,但测试似乎足够合理:

所以无论如何,我尝试了以下代码:

MYSQL *conn = mysql_init(NULL);
mysql_real_connect(conn, host, use, password, database, 0, NULL, 0);
mysql_autocommit(conn, 0);
mysql_query(conn, "INSERT INTO test VALUES(1)");
mysql_query(conn, "INSERT INTO test VALUES(2)");
mysql_query(conn, "INSERT INTO test VALUES(3)");
mysql_query(conn, "INSERT INTO test VALUES(4)");
mysql_close(conn);

很简单,关闭自动提交,做一堆插入,从不提交。在这种情况下,结果是查询有效回滚。当我查询数据库时,行不存在。

显然,在 mysql_close(conn); 之前添加一个 mysql_commit(conn); 实际上会导致创建行。

【讨论】:

    猜你喜欢
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2011-03-01
    • 2013-01-15
    • 2012-08-19
    • 2021-08-05
    • 2013-05-08
    相关资源
    最近更新 更多