LINQ to SQL, Concurrency-Probleme
Wir versuchen zu bauen ein High-Volume-Bestellungen Aufnehmen-System.
Es gibt drei wichtige Tabellen:
1. Bestellungen
2. OrderDetails
3. OrderShipment
Den Versand Tabelle enthält n-Eintrag pro Bestellung und jeder Datensatz Versand Eintrag kann geändert werden, bevor der Kunde akzeptiert th um, nach dem es gefroren ist. (Eine Anforderung)
Obwohl das passiert nicht in der realen Welt Szenarien...
während unserer tests laden, wir sind immer System.Daten.Linq -.ChangeConflictException Ausnahmen.
Zusammenfassung die reichen innerhalb einer transacion ist nicht zu helfen, entweder.
Können wir nicht erzwingen, LINQ to bekommen Sie eine Sperre auf die Zeile für die gesamte Dauer des update-Vorgangs?
Gibt es eine andere Möglichkeit, um dieses?
- Wie sind Sie mit dem Umgang mit LINQ Parallelität?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du echte Probleme mit gleichzeitigen updates auf die gleichen Daten haben, dann könnten Sie erwägen, die Durchführung der gesamten operation in einer Transaktion - d.h. die Daten und Begehen es. So lange, wie Sie behandeln die get/update/commit als eine kurzlebige, Atomare operation (d.h. nicht die pause für die user-Eingabe in der Mitte) sollte es OK sein.
Insbesondere mit einer Isolationsstufe serializable sind, kann niemand die Daten zu aktualisieren, dass Sie eine read-Sperre auf (also alles, was Sie abgefragt haben). Das problem ist nur, dass dies dazu führen könnte, deadlock-Szenarien, wenn unterschiedliche Abfragen Daten Lesen, die in verschiedenen Aufträgen. AFAIK, es gibt keinen Weg, um LINQ-to-SQL zu erteilen (UPDLOCK) - Hinweis, das ist eine Schande.
Entweder ein TransactionScope-oder eine SqlTransaction tun würde, solange Sie als serializable isolation (das ist der Standard für TransactionScope).
möchten Sie vielleicht einen Blick in Entity Framework, das führt alles ein Vorgang. Hier sind zwei podcasts, die können auch interessant sein, über Entity Framework.
DNRTV - Teil 1 -
Teil 2
Für diese Art von Situationen, D. H. wenn mehrere Benutzer können wollen, um änderungen an dem gleichen Datensatz/Kunde/Auftrag/was auch immer es ist besser zu bauen "sperren" in die Applikation Logik eher als die Verwendung von Datenbank-sperren.
Mit DB-locks zu lösen, logische Verriegelung der Daten zu präsentieren, die Sie mit einem Haufen neuer Fragen. Eine bessere Lösung ist, die Spalten und/oder Tabellen, in denen Sie angeben können, dass ein Auftrag/Kunde/etc bearbeitet wird [von Benutzer], bis Wann Sie gesperrt ist etc. Abfrage, die Tabelle (oder Spalten), um zu überprüfen, ob der Kunde/Auftrag/was ist zur Bearbeitung zur Verfügung stehen, bevor ein anderer Benutzer, um es zu Bearbeiten.
Finden Sie unter:
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=3984968&SiteID=1