Мы используем RDS (Amazon Relational Database Service) для нашей базы данных. у нас есть несколько sp, которые вызываются в transactionScope. мы настроили 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-логика)
Проблема: у меня возникает эта проблема, когда я запускаю такие транзакции
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) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов.
На самом деле эти термины для меня довольно новы, но, основываясь на поиске, я обнаружил, что DTC используется только тогда, когда у нас есть распределенные транзакции. В нашем случае его нет.
TransactionScope
?UnRegister
обращается к базе данных? Кроме того, если вы выполняете только одну операцию SQL - зачем использоватьTransactionScope
? - возможно, просто используйте обычную транзакцию - или, поскольку вы, кажется, используете хранимую процедуру, просто заставьте SP работать в атомарным способом, возможно, используя внутреннюю транзакцию (и никакой транзакции у вызывающей стороны) - person Marc Gravell   schedule 01.05.2019