c# - 发生未处理的异常后使用 C# Mysql Connector 禁用自动提交

标签 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这样做?

谢谢!

克里斯

最佳答案

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

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

克里斯

关于c# - 发生未处理的异常后使用 C# Mysql Connector 禁用自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12228850/

相关文章:

c# - 如何使代码块评估为 bool

c# - 将 RAW 字节数据转换为位图

c# - 创建 C# 泛型类的实例

php - 复选框和检查Datatable Jquery PHP Mysql中的所有功能

java - 为什么 TreeSet 抛出 ClassCastException?

c# - 以编程方式键入对象

mysql - SQL 中表 id 的值丢失

mysql - 当列存在时查询不同的表

c++ - 为什么不捕获 `std::promise::~promise` 中已经传播的异常

.net - 类库应该如何向用户/UI 呈现通知?