c# - transacciones - transaction entity framework 5
Entity Framework y nivel de aislamiento de transacciones. (1)
De forma predeterminada, una transacción tiene un nivel de IsolationLevel de serialización. Serializable es el nivel más alto. Requiere que la transacción se complete antes de que cualquier otra transacción pueda operar con los datos.
Tiene las siguientes restricciones:
- Los estados de cuenta no pueden leer datos que se hayan modificado pero que aún no hayan sido confirmados por otras transacciones.
- Ninguna otra transacción puede modificar los datos que han sido leídos por la transacción actual hasta que la transacción actual se complete.
- Otras transacciones no pueden insertar nuevas filas con valores clave que estarían dentro del rango de claves leídas por cualquier declaración en la transacción actual hasta que la transacción actual se complete.
Esta es una excelente publicación de blog que explica cómo utilizar Transacciones con Entity Framework: ejemplos de alcance de transacción de Entity Framework
ACTUALIZAR
En Entity Framework 6, el IsolationLevel predeterminado se cambia a READ_COMMITTED_SNAPSHOT para las bases de datos creadas usando Code First, lo que potencialmente permite más escalabilidad y menos puntos muertos. Ver las especificaciones futuras de EF 6.
Estoy usando Entity Framework 4.0. Ahora necesito restringir el acceso a una mesa mientras leo o le escribo. Probablemente eso es sobre el nivel de aislamiento de transacción.
¿Cómo puedo hacer eso?
Actualizar
esto es lo que tengo
using (var db = new MyDb())
{
using (TransactionScope scope = new TransactionScope())
{
var item = db.MyItems.Single(x => x.Id == 5);
item.Price = 12;
db.SaveChanges();
scope.Complete();
}
}
Sin embargo, cuando coloco un punto de interrupción en cualquier línea dentro de using (TransactionScope scope
y cuando me detengo allí, voy a Sql Server Management Studio y hago una consulta de selección (¡o incluso una actualización!) Desde una tabla que se está usando dentro de un transacción, no recibo un error por alguna razón, pero ¿por qué? No debe permitirme leer datos mientras se está ejecutando una transacción.