Как глобально изменить IsolationLevel всех транзакций Entity Framework

Я оцениваю EF для своих следующих новых приложений.

Как я могу глобально изменить IsolationLevel всех транзакций EF в приложении? Пример: Предположим, я хочу использовать «Чтение зафиксированного снимка».

Хотя можно указать IsolationLevel, когда мне все равно явно нужен TransactionScope (см. Код ниже), было бы уродливо инкапсулировать каждую операцию сохранения EF в TransactionScope .

 'OK
    Using tsc As New TransactionScope(TransactionScopeOption.RequiresNew, TransactionOption.ReadCommitted)
        UpdateShoppingCart
        EnqueueNewOrder
        SendConfirmationEmail
        tsc.Complete
    End Using

    'Is this really the only way to avoid Serializable?
    Using tsc As New TransactionScope(TransactionScopeOption.RequiresNew, TransactionOption.ReadCommitted)
      _ctx.SaveChanges()
      tsc.Complete
    End Using

    Class TransactionOption
        Public Shared ReadOnly ReadCommitted As New TransactionOptions() With {
            .IsolationLevel = IsolationLevel.ReadCommitted,
            .Timeout = TransactionManager.DefaultTimeout
            }
    End Class

Я полагаю, смешивание IsolationLevles - не лучшая идея. Я ошибаюсь?

При использовании Serializable и SQL Server (в отличие от Oracle) вставка простого невинно выглядящего чтения может вызвать взаимоблокировку блокировки преобразования.

Из EF FAQ: «Рекомендуется использовать транзакции READ COMMITTED и использовать READ COMMITTED SNAPSHOT ISOLATION, если вам нужно, чтобы читатели не блокировали писателей, а писатели не блокировали читателей».

Я не понимаю, почему EF по умолчанию использует Serializable и делает Так сложно изменить уровень изоляции по умолчанию - SQL Server (в отличие от многоверсионности Oracle) по умолчанию использует пессимистичную модель параллелизма. Опция конфигурации должна быть очень простой в реализации - или я что-то здесь упускаю?

7
задан Peter Meinl 26 February 2011 в 11:26
поделиться