Vollständige Parallelität – Übersicht (LINQ to SQL)
Aktualisiert: November 2007
LINQ to SQL unterstützt die Steuerung der vollständigen Parallelität. In der folgenden Tabelle werden Begriffe beschrieben, die in der LINQ to SQL-Dokumentation für vollständige Parallelität gelten:
Begriffe |
Beschreibung |
---|---|
Parallelität |
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. |
Steuerung der vollständigen 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 unvollständigen Parallelität, die den Datensatz sperrt, um Parallelitätskonflikte zu vermeiden. Die vollständige 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-Änderungsprotokollierer die folgenden Daten:
LINQ to SQL ermittelt dann, ob ein Objektkonflikt vorliegt (d. h., ob sich die Werte von einem oder mehreren 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 vollständigen Parallelität auf, wenn die beiden folgenden Bedingungen eintreten:
Der Client versucht, Änderungen an die Datenbank zu übergeben.
Ein oder mehrere Werte der Aktualisierungsprü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 eine Aktualisierung 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.
|
Manager |
Assistant |
Department |
---|---|---|---|
Ursprünglicher Zustand |
Alfreds |
Maria |
Sales |
User1 |
Alfred |
|
Marketing |
User2 |
|
Mary |
Service |
Sie können Konflikte wie diesen auf verschiedene Weise lösen. Weitere Informationen finden Sie unter Gewusst wie: Verwalten von Änderungskonflikten (LINQ to SQL).
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 Gewusst wie: Angeben, welche Member auf Parallelitätskonflikte getestet werden (LINQ to SQL).
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 Gewusst wie: Angeben des Zeitpunkts, zu dem Parallelitätsausnahmen ausgelöst werden (LINQ to SQL).
Ermitteln Sie, wie viele Konfliktdetails Sie abrufen möchten, und gestalten Sie den Try/Catch-Block entsprechend.
Weitere Informationen finden Sie unter Gewusst wie: Abrufen von Entitätskonfliktinformationen (LINQ to SQL) und Gewusst wie: Abrufen von Memberkonfliktinformationen (LINQ to SQL).
Definieren Sie in Ihrem try-/catch-Code, wie Sie die verschiedenen ermittelten Konflikte beheben möchten.
Weitere Informationen finden Sie unter Gewusst wie: Beheben von Parallelitätskonflikten durch das Erhalten von Datenbankwerten (LINQ to SQL), Gewusst wie: Beheben von Parallelitätskonflikten durch das Überschreiben von Datenbankwerten (LINQ to SQL) und Gewusst wie: Lösen von Parallelitätskonflikten durch das Zusammenführen mit Datenbankwerten (LINQ to SQL).
LINQ to SQL-Typen, die Konfliktermittlung und -behebung unterstützen
Zu den Klassen und Features, die die Behebung von Konflikten bei der vollständigen Parallelität in LINQ to SQL unterstützen, zählen:
Siehe auch
Weitere Ressourcen
Gewusst wie: Verwalten von Änderungskonflikten (LINQ to SQL)