Подтвердить что ты не робот

Недостаток использования TransactionScope RequiresNew

Я хочу понять, что это за использование TransactionScopeOption.RequiresNew в EntityFramework (с сервером Sql Server 2008), каковы причины, по которым мы НЕ следует использовать RequiresNew всегда.

С уважением.

4b9b3361

Ответ 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();
}

Ответ 2

Я просто хотел добавить здесь, что в нескольких определенных случаях метод, который я написал, находится внутри области родительской транзакции, которая может закрываться или не закрываться с помощью scope.Complete(), в этих случаях я не хотел быть зависимым от родительской транзакции, поэтому нам нужно было установить RequiresNew.

В общем, хотя я согласен, что он не нужен и должен использовать прочитанное.

http://msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx