私は大量のC++コードベースを継承しており、多くのmysql作業を行います。 コードは常に自動コミットを無効にして、次のようになり機能なりやすい:自動コミットで何が起こり、ロールバックされることはありませんか?
int function() {
if(mysql_real_query(conn, ...)) {
return -1;
}
if(mysql_real_query(conn, ...)) {
return -1;
}
mysql_commit(conn);
return 0;
}
もちろん、ここでの意図は、クエリが成功した場合にのみ問題が発生したコミットということです。しかし、そのうちの1人がいないとどうなりますか?最終的に、mysql接続は適切に閉じられますが、コードにはロールバックはありません。
これが終了すると、基本的には成功した変更をコミットしますか?あたかも何も起こらないかのようにロールバックしますか?
私のガットは、成功した最初のクエリを元に戻すために2番目のクエリが失敗した場合にロールバックするのが理にかなっていると言います。したがって、この関数はトランザクションに終わります。
もちろん、後の他のmysqlコードでは、前回の作業が失敗した場合に「奇妙な」状態になることがあるので、このコードは本質的に壊れています。しかし、私が行ってプログラムの振る舞いを変える前に、私は現在の行動が何であるかを理解したかったのです。
簡単にテストできます。トランザクションを開始し、いくつかの操作を行い、切断せずにプログラムを終了する - 変更がコミットされたかどうかを確認する/ –