Domanda

Ho tavolo Tasks: Id (PK), TaskName, Status
Stato è uno dei:. in coda , Busy , Completa
Voglio usare più thread per elaborare i compiti, e per questo ho bisogno di essere in grado di fare in una sola operazione:

var task = db.Tasks.FirstOrDefault(t=>t.Status == (byte) TaskStatus.Queued);
task.Status = (byte) TaskStatus.Busy;
db.SubmitChanges();

Ovviamente se il funzionamento non è atomica posso ottenere problemi di concorrenza. Qual è (se ne esiste uno) un modo destinato a fare quanto sopra utilizzando LINQ to SQL?

So che posso farlo con 1) storproc o 2) db.ExecuteCommand("...") o 3) gestire la with try/catch conflitto - ma voglio essere sicuro che non c'è un modo migliore

.

So che è una domanda molto semplice, ma non ero in grado di trovare una risposta definitiva a questa.

È stato utile?

Soluzione

Se si vogliono per essere sicuri che questo sta accadendo atomicamente nel database (indipendentemente da ciò che thread o di applicazione sta chiamando), probabilmente dovrebbe farlo in uno sProc e blocco ad un livello appropriato lì. Lo sproc dovrebbe recuperare e aggiornare il record, quindi rilasciare e restituirlo (Ack! Non intendo l'affermazione TSQL return, ma lo sai che select media, ho fiducia!)

Quindi, solo L2S chiama lo sProc e torna un compito su cui lavorare, già impostato come Busy. L2S non sa (né cure) cosa / come le cose erano chiuse -. E, pertanto, non possono questioni complicate e presentano maggiori possibilità di deadlock

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top