自动提交会发生什么情况被禁用,并且永远不会回滚?

时间:2012-02-14 21:31:43

标签: c++ mysql rollback autocommit

所以我继承了一个很大的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代码可以做一个提交,如果之前的一些工作失败,就会把事情处于“怪异”状态。但在我改变程序的行为之前,我想确保我理解当前的行为是什么。

1 个答案:

答案 0 :(得分: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);实际上会导致创建行。