MySQL データベースでトランザクションを機能させるために 1 週間を費やしました。まだ成功していません。実行中Windows 7 x64
、MySQL 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 @@autocommit
0を返すことを確認しました。
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
ですか?