3

MySQL データベースでトランザクションを機能させるために 1 週​​間を費やしました。まだ成功していません。実行中Windows 7 x64MySQL Server 5.6.7-rcおよびMySQL .NET Connector 6.6.4.

MySQL はそれがサポートされていると主張しているのでTransactionScope(私は今までにインターネット全体を読んだことがあります)、それを機能させるにはある種の特別な構成が必要であると推測しています。これが私がこれまでに試したことです:

自動コミット=0

  • セクションの下に追加my.iniしました。autocommit=0[mysqld]
  • セクションの下に追加my.iniしました。init_connect='SET autocommit=0'[mysqld]
  • Service Manager で--autocommit=0、コマンド ライン パラメーターとして追加しました。
  • SELECT @@autocommit0を返すことを確認しました。

sql_mode=トラディショナル

  • セクションの下に追加my.iniしました。sql-mode="TRADITIONAL"[mysqld]
  • Service Manager で--sql-mode=TRADITIONAL、コマンド ライン パラメーターとして追加しました。

分散トランザクション コーディネーター

  • DTC サービスの有効化/無効化を試みました。

以下のサンプルは、 を呼び出すとすぐに例外をスローします (System.Transactions.TransactionException例外は Ctr+Alt+E で有効にする必要があります) Open()。エラー メッセージは、トランザクションの状態に対して操作が有効ではありません。. 明らかに、サーバーはトランザクションに満足していません。これは、ロールバックが発生しないという事実によって証明されています。

var factory = System.Data.Common.DbProviderFactories.GetFactory("MySql.Data.MySqlClient");

using (var transaction = new System.Transactions.TransactionScope())
{
    var connection = factory.CreateConnection();
    connection.ConnectionString = "Server=localhost;Port=3306;Database=test;User ID=user;Password=user";
    connection.Open(); // <-- silent TransactionException here!

    var command = connection.CreateCommand();
    command.CommandText = "CREATE TABLE TestTable (ID INT) ENGINE = InnoDB DEFAULT CHARSET=utf8;";

    command.ExecuteNonQuery();

    command.CommandText = "INSERT INTO TestTable (ID) VALUES (123);";
    command.ExecuteNonQuery();

    // ATTENTION! This should imply a rollback!
    // transaction.Complete();
}

サンプル コードは で動作するSQL Serverので、この問題が と関係があることは確かですMySQL

質問:私はすべてを試しました。TransactionScopeこのコードを で機能させるにはどうすればよいMySQLですか?

4

1 に答える 1