Estoy escribiendo un servicio en segundo plano que necesita procesar una serie de trabajos, almacenados como registros en una tabla sqlserver. El servicio necesita encontrar los 20 trabajos más antiguos que se deben trabajar (where status = 'new'
), marcarlos (set status = 'processing'
), ejecutarlos y actualizar los trabajos posteriormente.Marcar atómica y devolver un grupo de filas en la base de datos
Es la primera parte con la que necesito ayuda. Podría haber varios subprocesos accediendo a la base de datos al mismo tiempo, y quiero asegurarme de que la consulta "mark & return" se ejecute atómicamente, o casi. Este servicio pasará relativamente poco tiempo accediendo a la base de datos, y no es el fin del mundo si un trabajo se ejecuta dos veces, así que podría aceptar una pequeña probabilidad de que los trabajos se ejecuten más de una vez para mayor simplicidad en el código.
¿Cuál es la mejor manera de hacerlo? Estoy usando linq-to-sql para mi capa de datos, pero supongo que tendré que bajar a t-sql para esto.
¿Puede explicar por qué habrá interbloqueos si la tabla no está agrupada por (estado, tiempo de enqueue) incluso después de utilizar las 3 sugerencias que prescribe? –
No sabía acerca de la cláusula OUTPUT, que junto con los consejos hace una solución completa. Esto responde mi propia pregunta en SO. –