【发布时间】: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