自动提交会被禁用,并且永远不会出现回滚

what happens with auto commit is disabled and there is never a rollback?

本文关键字:永远 提交      更新时间:2023-10-16

所以我继承了一个很大的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代码稍后可能会进行提交,从而使事情处于"奇怪"的状态。但在我去改变程序的行为之前,我想确保我了解当前的行为是什么。

正如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);实际上确实会导致创建行。