Вы должны использовать Required
, а не RequiresNew
.Требуется новый означает, что каждая операция будет использовать новую транзакцию, даже если существует уже существующая область транзакции.Это, безусловно, приведет к тупикам.Даже с Required
есть еще одна серьезная проблема с TransactionScope
, а именно то, что он создает по умолчанию транзакцию Serializable
, что является ужасно неудачным выбором, и еще одним способом избежать тупиковой ситуации и отсутствия масштабируемости.См. с использованием нового TransactionScope () Считается вредным .Вы всегда должны создавать область транзакции с явным TransactionOption
, устанавливающим уровень изоляции ReadCommitted
, что намного более разумный уровень изоляции:
using(TransactionScope scope = new TransactionScope(
TransactionScopeOption.Required,
new TransactionOptions {
IsolationLevel = IsolationLevel.ReadCommitted}))
{
/// do work here
...
scope.Complete();
}