0

現在、バックエンド データベースとして MySql を使用して C# アプリケーションを開発しています。

残念ながら、説明できない有線の動作が見つかりました。

トランザクションを使用して、複数のクエリを「結合」して、すべてのコマンドのみが実行されるか、何も実行されないようにしたいと考えていました。

しかし、私のコーディングミスにより、トランザクション中に未処理の例外が発生しました。

トランザクションについての私の理解は、そのような場合、トランザクションはロールバックされるということです。

それにもかかわらず、未処理の例外によるクラッシュのために、Mysql はデフォルトで AutoCommit を有効にして、切断後にコミットするように見えることがわかりました。

だから私は実行してそれを無効にしようとしましたSET autocommit = 0

しかし、これはうまくいきません。

編集: 次のコードを使用してトランザクションを作成しました:

_transaction = _mysqlConnection.BeginTransaction();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = _mysqlConnection;
cmd.Transaction = _transaction

他の人は、BEGIN を使用するとこの問題が解決するはずだと言いましたが、そうではありません。Mysql ログでは、次のクエリが実行されます。

239 Connect   user@localhost on gssm
239 Query     SHOW VARIABLES
239 Query     SHOW COLLATION
239 Query     SET character_set_results=NULL
239 Init DB   db
239 Query     SET autocommit = 0
239 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
239 Query     BEGIN
239 Query     INSERT INTO TestTable (KeyField, Value) VALUES ('foo', 'bar')

もちろん、未処理の例外が発生しないようにコードを修正する必要がありますが、Mysql がこれを行うのを防ぐ方法はありますか?

ありがとう!

クリス

4

4 に答える 4

2

実際にトランザクションをサポートするMySqlエンジンを使用することをお勧めします...MyISAMはサポートしていません。これが問題でした。したがって、トランザクションを使用する場合は、適切なエンジン(InnoDBなど)を使用していることを確認してください。

あなたの無駄と時間のために申し訳ありません、そしてあなたの提案に感謝します。

クリス

于 2012-09-02T08:03:51.563 に答える
0

手動でセッションを開始しようとしましたか

START TRANSACTION;

SET autocommit =0;

幸運を!

于 2012-09-01T15:16:47.707 に答える
0

例外ハンドラでトランザクションを手動でロールバックしましたか?

catch(Exception ex)
{
    try
    {
        trans.Rollback();
    }
    catch(MySqlException mse)
    {
        log.error(mse);
    }
}
于 2012-09-01T15:17:38.643 に答える
0

そのログで実際にトランザクションを作成しているわけではありません。詳細については、MySQL トランザクション ドキュメントを参照してください。BEGINステートメントの複合セットを開始するだけです。

ADO.NET を使用している場合、これを実現する最も簡単な方法は、正しいコミット/ロールバック セマンティクスを使用して新しいDbTransactionを作成することです。

于 2012-09-01T15:18:42.670 に答える