Estoy evaluando EF para mis próximas aplicaciones nuevas.Cómo cambiar globalmente IsolationLevel de todas las transacciones de Entity Framework
¿Cómo puedo cambiar globalmente el IsolationLevel de todas las transacciones de EF en una aplicación? Ej .: Supongamos que quiero usar "Leer captura confirmada".
Si bien es correcto especificar IsolationLevel cuando explícitamente necesito un TransactionScope de todos modos (vea el código a continuación), sería feo tener que encapsular cada operación de salvar EF en un 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
Supongo que mezclar IsolationLevles no es una buena idea. ¿Me equivoco con eso?
Con Serializable y SQL Server (a diferencia de Oracle) la inserción de una simple lectura inocente puede provocar un bloqueo de conversión.
Desde el FAQ EF: "Se recomienda el uso de transacciones de lectura comprometido y su utilización Lea aislamiento de instantánea COMPROMETIDOS si es necesario tener lectores no bloquean a los escritores y los escritores no bloquear los lectores."
No entiendo por qué EF se establece en Serializable y hace que sea tan difícil cambiar el nivel de aislamiento predeterminado - con SQL Server (en contraste con Oracle de múltiples versiones) predeterminado a un modelo de simultaneidad pesimista. Una opción de configuración debería ser muy fácil de implementar, ¿o me falta algo aquí?
¿Dónde encontraste que EF tiene el valor predeterminado Serializable? –