0

我目前正在开发一个使用 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

4 回答 4

2

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

很抱歉您的浪费和时间,并感谢您的建议。

克里斯

于 2012-09-02T08:03:51.563 回答
0

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

START TRANSACTION;

SET autocommit =0;

祝你好运!

于 2012-09-01T15:16:47.707 回答
0

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

catch(Exception ex)
{
    try
    {
        trans.Rollback();
    }
    catch(MySqlException mse)
    {
        log.error(mse);
    }
}
于 2012-09-01T15:17:38.643 回答
0

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

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

于 2012-09-01T15:18:42.670 回答