EF6,Mysql,开启事务时数据库发生提交错误不能自动Rollback怎么办?
以下这么一段代码:
其中事务使用的是 using 包含了BeginTransaction,理论上来说,使用了using,在异常时会自动调用trans.Dispose(),而Dispose应该默认回滚。
但我发现并不是这样,在第一次保存失败后,因为没回滚,我在第二次点击保存时,就产生了嵌套事务,反馈了不一样的错误提示:System.InvalidOperationException: Nested transactions are not supported.
然后这个时候,事务才被回滚。所以第三次点击保存时,就能正常反馈出第一次的数据库错误了。
我网上查询了资料,找到这个话题:
https://stackoverflow.com/questions/22486489/entity-framework-6-transaction-rollback
其中,讲到了对于sqlserver 数据库是能自动回滚的

但对mysql确实无效。
采用土方法,就是每个用事务的地方,用try catch包裹起来:

但这样太啰嗦了,有没有更好的方法?
public void DeleteItem(long itemId)
{
using (var context = new AppDbContext())
using (var trans = context.Database.BeginTransaction(IsolationLevel.ReadCommitted))
{
//使用中的单件不允许删除
var detail = context.in_changedetail.FirstOrDefault(c => c.ItemId == itemId);
if (detail != null) throw new ShowErrorException("此单件已有出入库记录,不能删除!");
//删除
context.ba_item.Where(c => c.ItemId == itemId).Delete();
context.ba_itemcustom.Where(c => c.ItemId == itemId).Delete();
trans.Commit();
}
}其中事务使用的是 using 包含了BeginTransaction,理论上来说,使用了using,在异常时会自动调用trans.Dispose(),而Dispose应该默认回滚。
但我发现并不是这样,在第一次保存失败后,因为没回滚,我在第二次点击保存时,就产生了嵌套事务,反馈了不一样的错误提示:System.InvalidOperationException: Nested transactions are not supported.
然后这个时候,事务才被回滚。所以第三次点击保存时,就能正常反馈出第一次的数据库错误了。
我网上查询了资料,找到这个话题:
https://stackoverflow.com/questions/22486489/entity-framework-6-transaction-rollback
其中,讲到了对于sqlserver 数据库是能自动回滚的

但对mysql确实无效。
采用土方法,就是每个用事务的地方,用try catch包裹起来:

但这样太啰嗦了,有没有更好的方法?
...全文
相关推荐
mysql实现事务的提交与回滚的实例详解
在本篇文章中我们给大家分享一篇关于mysql实现事务的提交与回滚的实例内容,有需要的朋友们可以参考学习下。
如何在asp.net中使用mysql
试试这个:一个使用MySQL数据库的ASP.NET应用程序[^]希望它会有所帮助:)
通用数据库操作。支持Sql Server_Oracle_MySQL_Sqlite
通用数据库操作。支持Sql Server_Oracle_MySQL_Sqlite通用数据库操作。支持Sql Server_Oracle_MySQL_Sqlite
C#访问数据库
C#访问数据库C#访问数据库
C#数据库开发以及如何操作数据库
C#编程中最主要的一步。如何操作数据库以及进行删除、查询、添加、更新记录等。


