2012-02-14 6 views
1

私は大量の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コードでは、前回の作業が失敗した場合に「奇妙な」状態になることがあるので、このコードは本質的に壊れています。しかし、私が行ってプログラムの振る舞いを変える前に、私は現在の行動が何であるかを理解したかったのです。

+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); 

はシンプル、自動をオフにしますコミット、挿入の束を行い、決してコミットしないでください。この場合、クエリはが効果的にロールバックされます()。私がDBに照会するとき、行はそこにありません。

明らかに、mysql_close(conn);の直前にmysql_commit(conn);を追加するだけで、実際に行が作成されます。