Esta pregunta se refiere a las mejores prácticas para manejar muchas inserciones o actualizaciones utilizando Microsoft Entity Framework. El problema es que escribimos un programa de larga ejecución que extrae miles de registros de la base de datos y luego actualiza un solo campo en cada uno de esos registros, uno por uno. Para nuestra gran consternación, nos dimos cuenta de que cada uno de estos registros que se actualizaron se bloquearon durante el tiempo en que no se eliminó el ObjectContext. A continuación se muestra un poco de pseudocódigo (en realidad no ejecutar) para ilustrar:Cómo evitar el bloqueo de la base de datos en Entity Framework 4 Cuando se realizan muchas actualizaciones
using(ObjectContext context = new ObjectContext())
{
var myRecords = context.CreateObjectSet<MyType>().AsQueryable();
foreach(var record in myRecords)
{
record.MyField = "updated!";
context.SaveChanges();
//--do something really slow like call an external web service
}
}
El problema es que tenemos que hacer muchos cambios sin ninguna consideración por las transacciones. Nos sorprendimos al darnos cuenta de que llamar context.SaveChanges() en realidad crea el bloqueo en los registros y no lo libera hasta que se elimina el ObjectContext. En especial, NO queremos bloquear los registros en la base de datos ya que este es un sistema de alto tráfico y el programa podría ejecutarse durante horas.
Entonces la pregunta es: ¿cuál es la forma óptima de hacer muchas actualizaciones en Microsoft Entity Framework 4 SIN hacer todo en una transacción larga que bloquea la base de datos? Esperamos que la respuesta no sea crear un nuevo ObjectContext para cada actualización ...
¿Ve bloqueos de registros o bloqueos de bloqueo a páginas o tablas? –
Parece que la tabla completa está bloqueada, por lo que no puede insertar o actualizar registros. Sin embargo, puede seleccionar registros siempre que no seleccione uno de los registros que se han retirado.Sin embargo, en nuestro pseudo ejemplo anterior, retiramos todos los registros. En realidad, solo estábamos retirando un subconjunto del total de registros y solo esos registros no se podían leer. Sin embargo, toda la tabla está bloqueada desde escrituras. – jakejgordon