EF6,Mysql,开启事务时数据库发生提交错误不能自动Rollback怎么办?

圣殿骑士18 圣殿骑士18 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
以下这么一段代码:
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包裹起来:


但这样太啰嗦了,有没有更好的方法?
...全文
评论 13
收藏 已收藏
分享
返回顶部
圣殿骑士18
C# 111,129 成员 642,540 内容