Недостаток использования TransactionScope требует нового - PullRequest
13 голосов
/ 23 апреля 2011

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

С уважением.

Ответы [ 2 ]

23 голосов
/ 23 апреля 2011

Вы должны использовать 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();
}
1 голос
/ 29 июня 2012

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

В целом, хотя я согласен, что в этом нет необходимости, следует использовать read commit.

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

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