Im Umgang mit Konflikten haben Sie zwei Möglichkeiten:
- Sie können versuchen, den Konflikt zu vermeiden, und genau das tut Pessimistic Locking.
- Sie können auch zulassen, dass der Konflikt auftritt, aber Sie müssen ihn beim Festschreiben Ihrer Transaktionen erkennen, und genau das tut Optimistic Locking.
Betrachten wir nun die folgende Lost Update-Anomalie :
Die Anomalie "Lost Update" kann in der Isolationsstufe " Read Committed" auftreten .
In der Abbildung oben sehen wir, dass Alice glaubt, 40 von ihr abheben zu können, account
aber nicht merkt, dass Bob gerade den Kontostand geändert hat, und jetzt sind nur noch 20 auf diesem Konto.
Pessimistisches Sperren
Pessimistisches Sperren erreicht dieses Ziel, indem das Konto gemeinsam genutzt oder gelesen wird, sodass Bob das Konto nicht ändern kann.
In der obigen Abbildung erhalten Alice und Bob eine Lesesperre für die account
Tabellenzeile, die beide Benutzer gelesen haben. Die Datenbank erwirbt diese Sperren auf SQL Server, wenn Repeatable Read oder Serializable verwendet wird.
Da sowohl Alice als auch Bob das account
mit dem PK-Wert von gelesen haben 1
, kann keiner von ihnen es ändern, bis ein Benutzer die Lesesperre aufhebt. Dies liegt daran, dass eine Schreiboperation eine Schreib- / Exklusivsperre erfordert und gemeinsam genutzte / Lesesperren Schreib- / Exklusivsperren verhindern.
Erst nachdem Alice ihre Transaktion festgeschrieben hat und die Lesesperre für die account
Zeile aufgehoben wurde, wird Bob UPDATE
die Änderung fortsetzen und anwenden. Bis Alice die Lesesperre aufhebt, blockiert Bobs UPDATE.
Weitere Informationen dazu, wie Datenzugriffs-Frameworks die zugrunde liegende pessimistische Datenbank-Sperrunterstützung verwenden, finden Sie in diesem Artikel .
Optimistisches Sperren
Durch optimistisches Sperren kann der Konflikt auftreten, wird jedoch beim Anwenden von Alices UPDATE erkannt, wenn sich die Version geändert hat.
Dieses Mal haben wir eine zusätzliche version
Spalte. Die version
Spalte wird jedes Mal inkrementiert, wenn ein UPDATE oder DELETE ausgeführt wird, und sie wird auch in der WHERE-Klausel der UPDATE- und DELETE-Anweisungen verwendet. Damit dies funktioniert, müssen wir SELECT ausgeben und den aktuellen version
Wert lesen, bevor wir UPDATE oder DELETE ausführen. Andernfalls wissen wir nicht, welchen Versionswert an die WHERE-Klausel übergeben oder inkrementiert werden soll.
Weitere Informationen dazu, wie Datenzugriffs-Frameworks optimistisches Sperren implementieren, finden Sie in diesem Artikel .
Transaktionen auf Anwendungsebene
Relationale Datenbanksysteme sind in den späten 70er und frühen 80er Jahren entstanden, als ein Client normalerweise über ein Terminal eine Verbindung zu einem Mainframe herstellte. Aus diesem Grund definieren Datenbanksysteme immer noch Begriffe wie die SESSION-Einstellung.
Heutzutage führen wir über das Internet keine Lese- und Schreibvorgänge mehr im Kontext derselben Datenbanktransaktion aus, und ACID reicht nicht mehr aus.
Betrachten Sie beispielsweise den folgenden Anwendungsfall:
Ohne optimistisches Sperren wäre dieses verlorene Update auf keinen Fall abgefangen worden, selbst wenn die Datenbanktransaktionen Serializable verwendet hätten. Dies liegt daran, dass Lese- und Schreibvorgänge in separaten HTTP-Anforderungen ausgeführt werden, daher bei verschiedenen Datenbanktransaktionen.
Optimistisches Sperren kann Ihnen also helfen, verlorene Updates zu verhindern, selbst wenn Sie Transaktionen auf Anwendungsebene verwenden, die auch die Denkzeit des Benutzers berücksichtigen.
Weitere Informationen zu Transaktionen auf Anwendungsebene oder zu logischen Transaktionen finden Sie in diesem Artikel .
Fazit
Optimistisches Sperren ist eine sehr nützliche Technik und funktioniert auch dann einwandfrei, wenn weniger strenge Isolationsstufen wie Read Committed verwendet werden oder wenn Lese- und Schreibvorgänge in nachfolgenden Datenbanktransaktionen ausgeführt werden.
Der Nachteil der optimistischen Sperrung besteht darin, dass das Datenzugriffsframework beim Abfangen eines Rollbacks ein Rollback auslöst OptimisticLockException
und somit die gesamte Arbeit verliert, die wir zuvor durch die aktuell ausgeführte Transaktion geleistet haben.
Je mehr Streit, desto mehr Konflikte und desto größer die Chance, Transaktionen abzubrechen. Rollbacks können für das Datenbanksystem kostspielig sein, da alle derzeit ausstehenden Änderungen rückgängig gemacht werden müssen, die sowohl Tabellenzeilen als auch Indexdatensätze betreffen können.
Aus diesem Grund kann pessimistisches Sperren bei häufigen Konflikten geeignet sein, da es die Wahrscheinlichkeit verringert, dass Transaktionen zurückgesetzt werden.