Я читал документ из шаблонов Microsoft & практики группы (Data Access for Highly-Scalable Solutions: Using SQL, NoSQL, and Polyglot Persistence).Использует TransactionScope в Entity Framework запрашивает хорошую идею?
В главе 3 в разделе "Retrieving Data from the SQL Server Database" авторы обсуждают использование Entity Framework для загрузки объектов из базы данных. Вот немного их пример кода:
using (var context = new PersonContext())
{
Person person = null;
using (var transactionScope = this.GetTransactionScope())
{
person = context.Persons
.Include(p => p.Addresses)
.Include(p => p.CreditCards)
.Include(p => p.EmailAddresses)
.Include(p => p.Password)
.SingleOrDefault(p => p.BusinessEntityId == personId);
transactionScope.Complete();
}
// etc...
}
Примечание использование объема пользовательских транзакций с помощью метода GetTransactionScope
, реализованная в их базовом классе контекста, как так:
public abstract class BaseRepository
{
private static TransactionOptions transactionOptions = new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadCommitted
};
protected virtual TransactionScope GetTransactionScope()
{
return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
}
Working with Transactions (EF6 Onwards) на MSDN гласит:
Во всех версиях Entity Framework всякий раз, когда вы выполняете SaveChanges() для вставки, обновления или удаления в базе данных, фреймворк будет обертывать эту операцию в транзакции [... ] уровень изоляции транзакции - это любой уровень изоляции, который поставщик базы данных считает своей настройкой по умолчанию. По умолчанию, например, на SQL Server это READ COMMITTED. Entity Framework не переносит запросы в транзакции. Эта функция по умолчанию подходит для большого количества пользователей
Смелый акцент делается на моем.
Мой вопрос: является использование TransactionScope, как показано выше, overkill, особенно для чтения данных, при использовании Entity Framework?
(я понял, после размещения, что ответ на этот вопрос может быть несколько на основе мнений, сожалею об этом.)
С этим 'isolLevel' этот код переполняется, если транзакция содержит только операцию чтения. Но если 'isolLevel' является' ReadUncommited', этот код позволит вам прочитать грязную строку (еще не объявленную). –
Вам следует избегать области транзакции, если она не служит коммерческой цели. это позволит избежать взаимоблокировок и проблем с производительностью. – MichaelD