LINQ to SQL lectura-escritura de prueba como una sola operación
-
09-10-2019 - |
Pregunta
Tengo mesa Tasks
: Id (PK), TaskName, Status
El estado es uno de:. En cola , Ocupado , Completo
Quiero utilizar varios subprocesos para procesar las tareas, y para eso tengo que ser capaz de hacer en una sola operación:
var task = db.Tasks.FirstOrDefault(t=>t.Status == (byte) TaskStatus.Queued);
task.Status = (byte) TaskStatus.Busy;
db.SubmitChanges();
Obviamente, si la operación no es atómica puedo conseguir problemas de concurrencia. ¿Cuál es (si existe) una forma destinada a hacer lo anterior utilizando LINQ to SQL?
Sé que puedo hacer eso con 1) STORPROC o 2) db.ExecuteCommand("...")
o 3) manejar el conflicto with try/catch
- pero quiero estar seguro de que no hay una mejor manera
Sé que es una pregunta muy básica, pero no era capaz de encontrar una respuesta definitiva a esto.
Solución
Si usted está deseando estar seguro de que esto está sucediendo de forma atómica en la base de datos (independientemente de lo que el hilo o la aplicación está llamando), probablemente debería hacerlo en un procedimiento almacenado y el bloqueo en un nivel apropiado allí. El procedimiento almacenado debe recuperar y actualizar el registro, a continuación, suelte y devolverlo (Ack! No me refiero a la declaración TSQL return
, pero ya se sabe que select
media, me confianza!)
Así L2S sólo llama a la sproc y vuelve una tarea para trabajar, ya establecido como Busy
. L2S ni sabe ni le importa) (qué / cómo las cosas estaban cerradas con llave. - y por lo tanto no se pueden complicar las cosas e introducen más posibilidades de bloqueos