TransactionScope должен быть включен DTC в C # MVC - PullRequest
0 голосов
/ 01 мая 2019

Мы используем RDS (Amazon Relational Database Service) для нашей базы данных. у нас есть некоторые sp-ы, которые вызвали транзакции. мы настроили ExecutionStrategy для нашего DBConfig, как это

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. мой вопрос почему мне нужен код неисправности

Основной поставщик не удалось открыть. Сетевой доступ для Диспетчер распределенных транзакций (MSDTC) отключен. пожалуйста включить DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов.

На самом деле эти термины довольно новы для меня, но на основании поиска, который я обнаружил, DTC используется только тогда, когда у нас есть распределенные транзакции. В нашем случае у нас его нет.

1 Ответ

0 голосов
/ 20 мая 2019

Решением может быть использование устаревших типов транзакций вместо области транзакций.по-видимому, служба там может использовать другой контекст. Я также добавил 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();
                       //....
                    }
                 }
...