TransactionScope 需要在 C# MVC 中启用 DTC

TransactionScope needs DTC enabled in C# MVC

我们正在为我们的数据库使用 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(相关文章让我使用这个 defaultStrategy: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

The underlying provider failed on Open. Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool.

实际上这些术语对我来说很新,但是根据搜索我发现 DTC 只在我们有分布式事务时使用。否则,我们没有。

一个解决方案可能是使用旧类型的事务而不是事务范围。显然那里的服务可能使用另一个上下文。我还添加了 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();
                       //....
                    }
                 }