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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top