そのため、多くの mysql 作業を行う大規模な C++ コード ベースを継承しました。 コードは常に自動コミットを無効にし、次のような関数を持つ傾向があります。
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 コードがコミットを実行して、物事を「奇妙な」状態にする可能性があるからです。しかし、プログラムの動作を変更する前に、現在の動作がどのようなものかを理解しておく必要がありました。