我目前正在开发一个带有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这样做?
谢谢!
克里斯
答案 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 docs。 BEGIN
只是启动一组复合语句。
如果您正在使用ADO.NET,最简单的方法就是使用正确的提交/回滚语义创建一个新的DbTransaction。