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