在EF Core2.1之后,加了对 System.Transactions 功能(如 TransactionScope)的应用。 使用支持该功能的数据库提供程序时,这将适用于 .NET Framework 和 .NET Core。该特性也称为“氛围事务”(ambient transaction),它支持多个资源间协调事务,包括数据库、消息队列、Web服务和文件系统等。例如,开发人员可在对事务NTFS硬盘的写操作失败的情况下,自动回滚数据库更改。
举个小例
public void CreateNewTrade()
{
using (var scope = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
var newTrade = new TradeRecord() { TradeType = TradeType.消费.GetEnumValue(), Amount = 10, Title = "测试交易" };
_tradeRepository.Insert(newTrade);
_tradeRepository.SaveChanges();
_tradeOrderRepository.Insert(new TradeOrder() { Title = "测试订单" });
_tradeOrderRepository.SaveChanges();
// throw new Exception("当发生异常,将不会保存上面两步操作");
_payInfoRepository.Insert(new Payinfo() { Status = (int)PayStatus.待付款, TradeId = newTrade.Id });
_payInfoRepository.SaveChanges();
scope.Complete();
}
}
解决 EF Core 使用Mysql报错 The current provider does not support ambient transactions.
不过由于2.1刚发布不后,其它数据库提供提供程序还未对Mysql的事务提供支付。因而,在连接非sqlserver数据库时,可能会提示异常:
The current provider does not support ambient transactions.
解决办法是在nuget上更新您的 数据库提供程序(Provider),您可以从 官方整理 数据库提供程序找到合适您数据库的相关Nuget包进行更新。
我连接的是Mysql数据库,在使用之前使用TransactionScope方法时,提示异常,
经排查Pomelo.EntityFrameworkCore.MySql还未提供事务的支持,于是在nuget上将其卸载,
重新安装 MySql.Data.EntityFrameworkCore 作为数据库提供程序。之后,一切正常。
引用官方描述
System.Transactions 的限制
-
EF Core 依赖数据库提供程序以实现对 System.Transactions 的支持。 虽然支持在 .NET Framework 的 ADO.NET 提供程序之间十分常见,但最近才将 API 添加到 .NET Core,因此支持并未得到广泛应用。 如果提供程序未实现对 System.Transactions 的支持,则可能会完全忽略对这些 API 的调用。 SqlClient for .NET Core 从 2.1 及以上版本开始支持 System.Transactions。 尝试使用该功能时,SqlClient for .NET Core 2.0 将引发异常。
重要
建议你测试在依赖提供程序以管理事务之前 API 与该提供程序的行为是否正确。 如果不正确,则建议你与数据库提供程序的维护人员联系。
-
自版本 2.1 起,.NET Core 中的 System.Transactions 实现不包括对分布式事务的支持,因此不能使用
TransactionScope
或CommittableTransaction
来跨多个资源管理器协调事务。