我花了一周的时间试图让事务为我的 MySQL 数据库工作。仍然没有成功。运行Windows 7 x64
,MySQL Server 5.6.7-rc
和MySQL .NET Connector 6.6.4
。
MySQL 声称它TransactionScope
是受支持的(我现在已经阅读了整个 Internet),所以我猜我需要一些特殊的配置才能让它工作。这是我到目前为止所尝试的:
自动提交=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
?