Frage

Ich habe Tasks Tabelle: Id (PK), TaskName, Status
Der Status eines von:. Queued , Besetzt , Komplette
Ich mag die Aufgaben mehrere Threads verwenden, zu verarbeiten, und dafür brauche ich in einem Arbeitsgang tun können:

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

Natürlich, wenn der Betrieb nicht atomar ist, kann ich Concurrency Probleme bekommen. Was ist ein beabsichtigter Weise das zu tun (falls vorhanden) oben mit Linq-to-Sql?

Ich weiß, ich kann das tun mit 1) storproc oder 2) db.ExecuteCommand("...") oder 3) Griff des Konflikt with try/catch - aber ich will sicher sein gibt es keine bessere Art und Weise

.

Ich weiß, dass es eine sehr einfache Frage, aber ich war nicht in der Lage eine definitive Antwort auf diese zu finden.

War es hilfreich?

Lösung

Wenn Sie wollen sicher sein, dass dies geschieht atomar in der Datenbank (unabhängig davon, was Thread oder eine Anwendung es aufruft), werden Sie wahrscheinlich es tun sollten in einem sproc und Schloss auf einem angemessenen Niveau gibt. Die sproc sollte die Aufzeichnung abzurufen und aktualisieren, dann loslassen und senden es (Ack! Ich meine nicht die TSQL return Aussage, aber Sie wissen, ich meine select es, ich Vertrauen!)

So L2S nur Anrufe die sproc und wird auf eine neue Aufgabe an der Arbeit, die bereits als Busy gesetzt. weder L2S weiß (noch Sorgen), was / wie die Dinge waren verschlossen -. und kann daher nicht noch komplizierter zu machen und einzuführen mehr Chancen für Deadlocks

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top