我目前正在开发一个以C#作为后端数据库的MySql应用程序。
不幸的是我发现了一种我无法解释的行为。
我想使用事务,“组合”多个查询,以确保只执行所有命令或没有执行。
但是,由于我的编码错误,在事务处理期间发生了一个未处理的异常。
我对事务的理解是,在这种情况下,事务被回滚。
尽管如此,我发现Mysql在默认情况下似乎启用了AutoCommit,并在断开连接后提交,原因是未处理的异常导致崩溃。
所以我尝试通过执行SET autocommit = 0来禁用它。
但这不管用。
编辑:i使用以下代码创建了事务:
_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这样做吗?
谢谢!
克里斯
发布于 2012-09-02 08:03:51
使用支持事务的MySql引擎是个好主意.MyISAM没有,这就是问题所在。因此,如果希望使用事务,请确保使用正确的引擎(例如,InnoDB)。
抱歉浪费了你的时间,谢谢你的建议。
克里斯
发布于 2012-09-01 15:16:47
您是否尝试过手动启动会话?
START TRANSACTION;之后
SET autocommit =0;祝好运!
发布于 2012-09-01 15:17:38
您是否手动回滚了异常处理程序上的事务?
catch(Exception ex)
{
    try
    {
        trans.Rollback();
    }
    catch(MySqlException mse)
    {
        log.error(mse);
    }
}https://stackoverflow.com/questions/12228850
复制相似问题