Я оцениваю EF для моих следующих новых приложений.
Как я могу глобально изменить IsolationLevel всех транзакций EF в приложении?
Пример: Предположим, я хочу использовать «Read Committed Snapshot».
Несмотря на то, что можно указывать 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 с несколькими версиями) по умолчанию используется пессимистическая модель параллелизма. Вариант конфигурации должен быть очень простым для реализации - или я что-то здесь упускаю?