【问题标题】:Disable AutoCommit using C# Mysql Connector after an unhandled exception在未处理的异常后使用 C# Mysql 连接器禁用 AutoCommit
【发布时间】:2012-08-27 01:39:03
【问题描述】:

我目前正在开发一个使用 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 这样做呢?

谢谢!

克里斯

【问题讨论】:

    标签: c# mysql exception transactions autocommit


    【解决方案1】:

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

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

    克里斯

    【讨论】:

      【解决方案2】:

      您实际上并没有在该日志中创建事务,请参阅the MySQL transaction docs 了解更多信息。 BEGIN 只是开始一组复合语句。

      如果您使用的是 ADO.NET,完成此任务的最简单方法是创建一个具有正确提交/回滚语义的新 DbTransaction

      【讨论】:

      • 嗨,马克,谢谢您的建议!我以为我做到了 - 我将创建事务的代码添加到问题中。克里斯
      【解决方案3】:

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

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

      【讨论】:

      • 嗨兰道夫,感谢您的回答。未处理的异常导致了问题,即有一个打开的数据读取器,因此发生了 MysqlException,因为我在 catch-block 中调用了 Rollback() ...
      【解决方案4】:

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

      START TRANSACTION;
      

      之后

      SET autocommit =0;
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-18
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多