1

そのため、多くの 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 コードがコミットを実行して、物事を「奇妙な」状態にする可能性があるからです。しかし、プログラムの動作を変更する前に、現在の動作がどのようなものかを理解しておく必要がありました。

4

1 に答える 1

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_commit(conn);明らかに、前に右を追加するだけmysql_close(conn);で、実際には行が作成されます。

于 2012-02-15T03:33:17.017 に答える