Optimistische Nebenläufigkeit: Übersicht
LINQ to SQL unterstützt die Steuerung der optimistischen Nebenläufigkeit. In der folgenden Tabelle werden Begriffe beschrieben, die in der LINQ to SQL-Dokumentation für optimistische Nebenläufigkeit gelten:
Begriffe | BESCHREIBUNG |
---|---|
concurrency | Die Situation, in der zwei oder mehr Benutzer gleichzeitig versuchen, die gleiche Datenbankzeile zu aktualisieren. |
Parallelitätskonflikt | Die Situation, in der zwei oder mehr Benutzer gleichzeitig versuchen, konkurrierende Werte an eine oder mehrere Datenbankzeilen zu übergeben. |
Parallelitätssteuerung | Die Technik zur Behebung von Parallelitätskonflikten. |
Steuerelement für vollständige Parallelität | Die Technik zur Prüfung, ob andere Transaktionen die Werte in einer Zeile geändert haben, bevor die Übergabe von Änderungen zugelassen wird. Gegensatz zur Steuerung der pessimistischen Nebenläufigkeit, die den Datensatz sperrt, um Nebenläufigkeitskonflikte zu vermeiden. Die vollständige optimistische Steuerung verdankt ihre Bezeichnung der Tatsache, dass sie davon ausgeht, dass ein Konflikt zwischen Transaktionen unwahrscheinlich ist. |
Konfliktlösung | Der Prozess des Aktualisierens eines problematischen Elements durch eine erneute Datenbankabfrage und Ausgleichen der Unterschiede. Wenn ein Objekt aktualisiert wird, enthält der LINQ to SQL-Änderungsnachverfolgung die folgenden Daten: - Die ursprünglich aus der Datenbank abgerufenen Werte, die für die Updateprüfung verwendet wurden - Die neuen Datenbankwerte aus der nachfolgenden Abfrage. LINQ to SQL ermittelt dann, ob ein Objektkonflikt vorliegt (d. h., ob sich die Werte von Membern geändert haben). Liegt ein Objektkonflikt vor, ermittelt LINQ to SQL dann, bei welchem Member dieser Konflikt auftritt. Jeder von LINQ to SQL erkannte Memberkonflikt wird einer Konfliktliste hinzugefügt. |
Im LINQ to SQL-Objektmodell tritt ein Konflikt bei der optimistischen Nebenläufigkeit auf, wenn die beiden folgenden Bedingungen eintreten:
Der Client versucht, Änderungen an die Datenbank zu übergeben.
Ein oder mehrere Werte der Updateprüfung wurden in der Datenbank aktualisiert, seit der Client sie zuletzt gelesen hat.
Die Behebung dieses Konflikts umfasst die Erkennung der Member, bei deren Objekten der Konflikt auftritt. Anschließend wird entschieden, wie weiter vorgegangen wird.
Hinweis
Nur die als Always oder WhenChanged zugeordneten Member nehmen an Prüfungen der vollständigen Parallelität teil. Für die als Never gekennzeichneten Member finden keine Prüfungen statt. Weitere Informationen finden Sie unter UpdateCheck.
Beispiel
Im folgenden Szenario bereitet beispielsweise User1 ein Update vor, indem er eine Zeile aus der Datenbank abruft. User1 empfängt eine Zeile mit Werten von Alfreds, Maria und Sales.
User1 möchte den Wert der Manager-Spalte in Alfred und den Wert der Department-Spalte in Marketing ändern. Bevor User1 diese Änderungen übergeben kann, hat User2 Änderungen an der Datenbank vorgenommen. Damit wurde der Wert der Assistant-Spalte in Mary und der Wert der Department-Spalte in Service geändert.
Wenn User1 jetzt versucht, Änderungen zu übergeben, schlägt die Übergabe fehl, und eine ChangeConflictException-Ausnahme wird ausgelöst. Dieser Fall tritt ein, weil die Datenbankwerte der Assistant-Spalte und der Department-Spalte nicht den Erwartungen entsprechen. Bei Membern, die die Assistant-Spalte und die Department-Spalte vertreten, tritt ein Konflikt auf. Die folgende Tabelle fasst diese Situation zusammen.
State | Manager | Assistant | Department |
---|---|---|---|
Ursprünglicher Zustand | Alfreds | Maria | Sales |
User1 | Alfred | Marketing | |
User2 | Mary | Dienst |
Sie können Konflikte wie diesen auf verschiedene Weise lösen. Weitere Informationen finden Sie unter Verwalten von Änderungskonflikten.
Checkliste für Konflikterkennung und -behebung
Sie können Konflikte auf jeder Detailebene erkennen und beheben. Einerseits können Sie alle Konflikte auf eine von drei Arten beheben (siehe RefreshMode). Hierbei müssen keine weiteren Aspekte berücksichtigt werden. Andererseits können Sie für jeden Konflikttyp bei jedem Member eine bestimmte Aktion zuweisen.
Definieren oder überarbeiten Sie die UpdateCheck-Optionen in Ihrem Objektmodell.
Weitere Informationen finden Sie unter Angeben, welche Member auf Nebenläufigkeitskonflikte getestet werden.
Im Try/Catch-Block Ihres Aufrufs für SubmitChanges können Sie angeben, zu welchem Zeitpunkt die Ausnahmen ausgelöst werden sollen.
Weitere Informationen finden Sie unter Angeben, wann Parallelitätsausnahmen ausgelöst werden.
Ermitteln Sie, wie viele Konfliktdetails Sie abrufen möchten, und gestalten Sie den Try/Catch-Block entsprechend.
Weitere Informationen finden Sie unter Abrufen von Informationen zu Entitätskonflikten und Abrufen von Informationen zu Memberkonflikten.
Definieren Sie in Ihrem
try
/catch
-Code, wie Sie die verschiedenen ermittelten Konflikte beheben möchten.Weitere Informationen finden Sie unter Auflösen von Nebenläufigkeitskonflikten durch Beibehalten von Datenbankwerten, Auflösen von Nebenläufigkeitskonflikten durch Überschreiben von Datenbankwerten und Auflösen von Nebenläufigkeitskonflikten durch Zusammenführen von Datenbankwerten.
LINQ to SQL-Typen, die Konfliktermittlung und -behebung unterstützen
Zu den Klassen und Funktionen, die die Behebung von Konflikten bei der optimistischen Nebenläufigkeit in LINQ to SQL unterstützen, zählen: