我们正在为数据库使用RDS(亚马逊关系数据库服务)。我们有一些sp,它们在transactionScope中被调用。我们像这样
为我们的DBConfig定制了ExecutionStrategypublic class MpDbConfiguration : DbConfiguration
{
public MpDbConfiguration()
{
//SetExecutionStrategy(
// "System.Data.SqlClient", () => new MpExecutionStrategy(10, TimeSpan.FromMilliseconds(100)));
SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new MpExecutionStrategy(10, TimeSpan.FromMilliseconds(100)));
}
//.....
}
当我们进行用户交易时,SuspendExecutionStrategy设置为True(相关文章使我使用了defaultdefault策略:https://docs.microsoft.com/en-us/ef/ef6/fundamentals/connection-resiliency/retry-logic)
问题:运行这样的事务时,我会遇到这个问题
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }))
{
if (entity != null && !string.IsNullOrEmpty(entity.EmailAddress))
{
ObjectFactory.GetInstance<IBankingService>().UnRegister(RequestContext.Current, entity);
}
Data.Configuration.MpDbConfiguration.SuspendExecutionStrategy = true;
Context.Current.Database.ExecuteSqlCommand("DeleteAccountByEmailAddress @usertodelete",
new SqlParameter("usertodelete", emailAddress));
scope.Complete();
Data.Configuration.MpDbConfiguration.SuspendExecutionStrategy = false;
}
//....
此SP是非常大的事务,但仅使用一个数据库。 我得到的错误是启用DTC。我的问题是为什么我需要DTC
基础提供程序在打开时失败。的网络访问 分布式事务管理器(MSDTC)已被禁用。请 在MSDTC的安全配置中启用DTC进行网络访问 使用组件服务管理工具。
实际上,这些术语对我来说还很新,但是基于搜索,我发现DTC仅在我们进行分布式事务处理时使用。万一我们没有它。
答案 0 :(得分:0)
一个解决方案可能是使用旧式事务而不是事务作用域。显然,那里的服务可能使用其他上下文。我还添加了try catch以在发生任何异常的情况下回滚事务。
感谢@MarcGravell的提示。
using (var dbContextTransaction = Context.Current.Database.BeginTransaction())
{
try
{
//--- the code run inside the transaction
Context.Current.SaveChanges();
dbContextTransaction.Commit();
return true;
}
catch (Exception ex)
{
dbContextTransaction.Rollback();
//....
}
}