在未处理的异常之后,使用C#Mysql Connector禁用AutoCommit

时间:2012-09-01 15:05:56

标签: c# mysql exception transactions autocommit

我目前正在开发一个带有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 个答案:

答案 0 :(得分:2)

使用实际支持事务的MySql引擎是个好主意... MyISAM没有,这就是问题所在。因此,如果想要使用事务,请确保使用正确的引擎(例如InnoDB)。

对不起您的浪费和时间,感谢您的建议。

克里斯

答案 1 :(得分:0)

您是否尝试过手动启动会话

START TRANSACTION;

之后

SET autocommit =0;

祝你好运!

答案 2 :(得分:0)

您是否在异常处理程序上手动回滚了事务?

catch(Exception ex)
{
    try
    {
        trans.Rollback();
    }
    catch(MySqlException mse)
    {
        log.error(mse);
    }
}

答案 3 :(得分:0)

您实际上并未在该日志中创建事务,有关详细信息,请参阅the MySQL transaction docsBEGIN只是启动一组复合语句。

如果您正在使用ADO.NET,最简单的方法就是使用正确的提交/回滚语义创建一个新的DbTransaction