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.

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:

Siehe auch