1

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

4

1 回答 1

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_commit(conn);之前简单地添加一个权利。mysql_close(conn);

于 2012-02-15T03:33:17.017 回答