Недостаток использования TransactionScope RequiresNew
Я хочу понять, что это за использование TransactionScopeOption.RequiresNew в EntityFramework (с сервером Sql Server 2008), каковы причины, по которым мы НЕ следует использовать RequiresNew всегда.
С уважением.
Ответ 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.
В общем, хотя я согласен, что он не нужен и должен использовать прочитанное.