Verlorene Aktualisierungen verhindern

Objective

After completing this lesson, you will be able to verwenden Sie ETags zum Schutz vor Datenverlust

Parallelitätskontrolle

Im Folgenden möchten wir uns einen Überblick über die Optionen verschaffen, die CAP bietet, um die Datenintegrität sicherzustellen, wenn zeitgleiche Modifikationen gleichzeitig ausgeführt werden.

Die CAP-Laufzeiten unterstützen verschiedene Möglichkeiten zur Vermeidung von Lost-Update-Situationen, wie im folgenden Video dokumentiert.

Optimistisches Sperren

Wir beginnen mit dem optimistischen Sperrkonzept, das auf ETags (Entitäts-Tags) basiert. Um ETags für eine Modellentität zu aktivieren, fügen Sie die Annotation @odata.etag zu einem Element der Entitätsdefinition hinzu.

Im gezeigten Beispiel wird das modifiedAt-Element aus dem verwalteten Aspekt als ETag-Element sowohl für die Dokumentenmappenentität als auch für die Autorenentität definiert. Hierfür wird die annotate -Direktive verwendet, mit der vorhandene Definitionen annotiert werden können.

Notiz

Als ETag-Element eignen sich Elemente, deren Inhalt sich bei jeder Aktualisierung eines Datensatzes eindeutig ändert. Daher ist das modifiedAt-Element des vordefinierten verwalteten Aspekts ein guter Kandidat. Sie können auch Update-Zähler oder UUIDs verwenden, die bei jeder Aktualisierung neu berechnet werden.

Die Idee eines ETags besteht darin, eine bestimmte Version einer Entität zu identifizieren, in unserem Beispiel die Version eines Buchs oder eines Autors. Damit kann die Integrität der Daten, wie im folgenden Beispiel erläutert, ohne Verwendung von Sperren gewährleistet werden.

Angenommen, wir rufen einen bestimmten Autor über die folgende Anfrage ab, da wir seine Daten ändern möchten:

Code Snippet
1
GET Authors(18f76942-bfb3-40c5-8300-f999f14e9cc2)

Mit dieser Anfrage wird die Version des Autors, d.h. der Wert des ETag-Elements modifiedAt, automatisch über den HTTP-Response-Header ETag zurückgegeben, z.B.:

Code Snippet
1
ETag: W/"2024-03-15T11:30:48.069Z"

Um Daten, die am Autor geändert wurden, zurückzuschreiben, wird der empfangene ETag-Wert wie folgt im HTTP-Header If-Match des entsprechenden Änderungsantrags verwendet:

Code Snippet
1234567
PUT Authors(18f76942-bfb3-40c5-8300-f999f14e9cc2) If-Match: W/"2024-03-15T11:30:48.069Z" Content-Type: application/json { ... }

CAP prüft dann, ob sich der Inhalt des modifiedAt -Elements in der Zwischenzeit geändert hat. Ist dies nicht der Fall, werden die Autorendaten in der Datenbank geändert, und das Feld modifiedAt ETag wird aktualisiert. Wenn ja, bedeutet dies, dass der Autor seit dem Lesen der Daten über einen anderen Request geändert wurde. CAP bricht daher den Änderungsantrag ab und setzt den Statuscode 412 (Vorbedingung fehlgeschlagen) für die HTTP-Response. Der Antworttext enthält einen Fehler ähnlich dem folgenden:

JSON
12345
"error": { "code": "412", "message": "Precondition Failed", "@Common.numericSeverity": 4 }

Pessimistisches Sperren

Die optimistische Sperre stellt die Datenintegrität bei gleichzeitigen Änderungen durch verschiedene Anforderungen sicher.

Pessimistische Sperren hingegen gewährleisten die Datenintegrität bei gleichzeitigen Modifikationen durch gleichzeitige Transaktionen. Mit dem pessimistischen Sperren können Sie Daten sperren, sodass andere Transaktionen gegen Änderungen der Daten gesperrt sind.

CAP nutzt Datenbanksperren für pessimistische Sperren, wobei zwischen Schreibsperren und Lesesperren unterschieden wird.

Ausschließlich gesperrte Datensätze können von anderen Transaktionen weder geändert noch gelesen werden. Schreibsperren werden gesetzt, wenn die Datensätze von der Datenbank gelesen werden. Die Query API der CAP stellt dafür die Methode forUpdate() zur Verfügung.

Notiz

Das Erstellen und Ausführen von Queries wird später besprochen.

Lesesperren verhindern auch gleichzeitige Aktualisierungen durch parallele Transaktionen. Sie erlauben jedoch allen Transaktionen, die gesperrten Datensätze zu lesen.

Um Lesesperren zu setzen, stellt das Abfrage-API die Methode forShareLock() bereit.

Erworbene Sperren (ob exklusiv oder gemeinsam) werden freigegeben, wenn die aktuelle Transaktion abgeschlossen, d.h. festgeschrieben oder zurückgesetzt wird.

Notiz

Pessimistische Sperren werden von SQLite nicht unterstützt.

Demonstration und Übung: Optimistisches Concurrency-Control hinzufügen

Notiz

Führen Sie als Übung die Schritt-für-Schritt-Anleitung in der folgenden Demonstration selbst im SAP Business Application Studio durch.

Verwenden Sie als Ausgangspunkt für die Übung das Ergebnis der vorherigen Übung Eingabevalidierung implementieren, wenn Sie sie erfolgreich abgeschlossen haben. Alternativ können Sie auch den Branch 8_input_validation aus dem folgenden GitHub-Repository als Ausgangspunkt verwenden:

https://github.com/SAP-samples/cap-development-learning-journey

Die vollständige Implementierung der Simulation finden Sie im Branch 9_concurrency_control des GitHub-Repositorys.

Detaillierte Informationen zum Inhalt des Repositorys und dessen Verwendung finden Sie hier.

Sehen Sie sich das Video an, um zu erfahren, wie Sie eine optimistische Parallelitätskontrolle hinzufügen.