TransactionScope需要在C#MVC中启用DTC

时间:2019-05-01 05:48:20

标签: .net transactions entity-framework-6 transactionscope msdtc

我们正在为数据库使用RDS(亚马逊关系数据库服务)。我们有一些sp,它们在transactionScope中被调用。我们像这样

为我们的DBConfig定制了ExecutionStrategy
public 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仅在我们进行分布式事务处理时使用。万一我们没有它。

1 个答案:

答案 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();
                       //....
                    }
                 }