Sto scrivendo un servizio in background che deve elaborare una serie di lavori, memorizzati come record in una tabella sqlserver. Il servizio deve trovare i 20 lavori più vecchi che devono essere lavorati (where status = 'new'
), contrassegnarli (set status = 'processing'
), eseguirli e aggiornare i lavori in seguito.Contrassegna e restituisce un gruppo di righe nella banca dati in modo atomico
È la prima parte con cui ho bisogno di aiuto. Potrebbero esserci più thread che accedono al database contemporaneamente e voglio assicurarmi che la query "mark & return" venga eseguita in modo atomico, o quasi.
Questo servizio impiegherà relativamente poco tempo per accedere al database e non è la fine del mondo se un lavoro viene eseguito due volte, quindi potrei essere in grado di accettare una piccola probabilità di lavori in esecuzione più di una volta per una maggiore semplicità nel codice.
Qual è il modo migliore per farlo? Sto usando linq-to-sql per il mio livello dati, ma presumo che dovrò cadere in t-sql per questo.
Puoi spiegare perché ci saranno deadlock se la tabella non è raggruppata da (status, enqueue_time) anche dopo aver usato i 3 suggerimenti che prescrivi? –
Non conoscevo la clausola OUTPUT, che insieme ai suggerimenti fornisce una soluzione completa. Questo risponde alla mia domanda in SO. –