自动提交会被禁用,并且永远不会出现回滚
what happens with auto commit is disabled and there is never a rollback?
所以我继承了一个很大的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);
实际上确实会导致创建行。
相关文章:
- 在Google Kick start中提交时出错
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 密码登录程序将永远循环并显示不正确的结果
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- SFML 碰撞永远不会在我的系统中注册
- 使用 libgit2 创建 NOT INITIAL 提交
- 先进先出:一个进程永远不会从管道读取
- 移动构造函数永远不会被调用
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 程序永远不会进入虚拟析构函数
- 在 *.cpp 文件中实现的 c++ 函数/方法永远不会内联扩展吗?
- 指针永远不会在链表深层复制构造函数中达到 null
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- 我的代码厨师提交显示错误的结果
- 类似函数的宏参数名称替换是否保证永远不会发生?
- 在构建时执行execute_process以在构建时获取git提交哈希
- curl_slist->next 永远不会为空,因此当循环卡住时
- 自动提交会被禁用,并且永远不会出现回滚