Я хочу понять, что это за использование TransactionScopeOption.RequiresNew
в EntityFramework (с сервером Sql Server 2008), каковы причины, по которым мы НЕ следует использовать RequiresNew
всегда.
С уважением.
Я хочу понять, что это за использование TransactionScopeOption.RequiresNew
в EntityFramework (с сервером Sql Server 2008), каковы причины, по которым мы НЕ следует использовать RequiresNew
всегда.
С уважением.
Вы должны использовать 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();
}
Я просто хотел добавить здесь, что в нескольких определенных случаях метод, который я написал, находится внутри области родительской транзакции, которая может закрываться или не закрываться с помощью scope.Complete()
, в этих случаях я не хотел быть зависимым от родительской транзакции, поэтому нам нужно было установить RequiresNew.
В общем, хотя я согласен, что он не нужен и должен использовать прочитанное.
http://msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx