gpt4 book ai didi

c# - 使用 TransactionScope 时如何配置 MySQL 回滚?

转载 作者:行者123 更新时间:2023-11-29 03:41:26 24 4
gpt4 key购买 nike

我花了一个星期的时间尝试让事务处理适用于我的 MySQL 数据库。仍然没有成功。运行 Windows 7 x64MySQL Server 5.6.7-rcMySQL .NET Connector 6.6.4

MySQL 声称支持 TransactionScope(我现在已经阅读了整个 Internet),所以我猜我需要某种特殊配置才能让它工作。到目前为止,这是我尝试过的:

autocommit=0

  • my.ini 中,我在 [mysqld] 部分下面添加了 autocommit=0
  • my.ini 中,我在 [mysqld] 部分下方添加了 init_connect='SET autocommit=0'
  • 在服务管理器中,我添加了 --autocommit=0 作为命令行参数。
  • 我已验证 SELECT @@autocommit 返回 0。

sql_mode=TRADITIONAL

  • my.ini 中,我在 [mysqld] 部分下面添加了 sql-mode="TRADITIONAL"
  • 在服务管理器中,我添加了 --sql-mode=TRADITIONAL 作为命令行参数。

分布式事务协调器

  • 我已尝试启用/禁用 DTC 服务。

以下示例在调用 Open() 时立即抛出异常(System.Transactions.TransactionException 异常必须通过 Ctr+Alt+E 启用)。错误消息是该操作对交易状态无效。。显然,服务器对事务内容不满意 - 回滚不会发生这一事实证明了这一点。

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

最佳答案

MySQL 将在执行 DDL 语句时自动提交事件事务(参见 http://dev.mysql.com/doc/refman/5.5/en/cannot-roll-back.html)。因此,CREATE TABLE 之后的任何内容都不会成为事务的一部分。

如果执行如下 SQL 语句,也会发生同样的事情:

START TRANSACTION;
CREATE TABLE TestTable (ID INT) ENGINE = InnoDB DEFAULT CHARSET=utf8;
INSERT INTO TestTable (ID) VALUES (123);
ROLLBACK;

尝试将您的代码更改为:

var factory = MySqlClientFactory.Instance;
string connectionString = "Server=localhost;Port=3306;Database=test;User ID=user;Password=user";

// DDL cannot be performed in transaction as will commit
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
connection.Open();

var command = connection.CreateCommand();
command.CommandText = "CREATE TABLE TestTable (ID INT) ENGINE = InnoDB DEFAULT CHARSET=utf8;";
command.ExecuteNonQuery(); // will always commit here
}

// DML can be performed in transaction
using (var transaction = new System.Transactions.TransactionScope())
using (var connection = factory.CreateConnection())
{
connection.ConnectionString = connectionString;
connection.Open();

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

// should rollback here
//transaction.Complete();
}

关于c# - 使用 TransactionScope 时如何配置 MySQL 回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13394842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com