Beim Umgang mit Konflikten haben Sie zwei Möglichkeiten:
- Sie können versuchen, den Konflikt zu vermeiden, und das ist es, was Pessimistic Locking tut.
- Oder Sie können den Konflikt zulassen, aber Sie müssen ihn bei der Übergabe Ihrer Transaktionen erkennen, und das ist die Aufgabe von Optimistic Locking.
Betrachten wir nun die folgende Anomalie des verlorenen Updates:
![Lost Update]()
Die Anomalie "Verlorene Aktualisierung" kann auf der Isolationsebene "Read Committed" auftreten.
Im obigen Diagramm können wir sehen, dass Alice glaubt, dass sie 40 von ihrem Konto abheben kann account
merkt aber nicht, dass Bob gerade den Kontostand geändert hat und jetzt nur noch 20 auf dem Konto sind.
Pessimistische Sperrung
Pessimistisches Sperren erreicht dieses Ziel, indem es eine gemeinsame oder eine Lesesperre für das Konto einrichtet, so dass Bob daran gehindert wird, das Konto zu ändern.
![Lost Update Pessimistic Locking]()
In dem obigen Diagramm erhalten sowohl Alice als auch Bob eine Lesesperre für die Datei account
Tabellenzeile, die beide Benutzer gelesen haben. Die Datenbank erwirbt diese Sperren auf SQL Server, wenn sie Repeatable Read oder Serializable verwendet.
Da sowohl Alice als auch Bob die account
mit dem PK-Wert von 1
kann keiner von ihnen etwas ändern, bis ein Benutzer die Lesesperre aufhebt. Dies liegt daran, dass ein Schreibvorgang den Erwerb einer Schreib-/Exklusivsperre erfordert, und gemeinsam genutzte Lese-/Lesesperren verhindern Schreib-/Exklusivsperren.
Erst nachdem Alice ihre Transaktion bestätigt hat und die Lesesperre für die Datei account
Reihe, Bob UPDATE
wird fortgesetzt und die Änderung übernommen. Bis Alice die Lesesperre aufhebt, wird Bobs UPDATE blockiert.
Optimistische Verriegelung
Optimistic Locking lässt den Konflikt zu, entdeckt ihn aber bei der Anwendung von Alices UPDATE, da sich die Version geändert hat.
![Application-level transactions]()
Dieses Mal haben wir eine zusätzliche version
Spalte. Die version
Spalte wird jedes Mal erhöht, 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 die SELECT-Anweisung ausführen und die aktuelle version
vor der Ausführung des UPDATE oder DELETE, da wir sonst nicht wüssten, welchen Versionswert wir an die WHERE-Klausel übergeben oder inkrementieren sollen.
Transaktionen auf Anwendungsebene
Relationale Datenbanksysteme sind in den späten 70er und frühen 80er Jahren entstanden, als ein Client in der Regel über ein Terminal eine Verbindung zu einem Großrechner herstellte. Aus diesem Grund werden in Datenbanksystemen immer noch Begriffe wie SESSION-Einstellung definiert.
Heutzutage, im Internet, werden Lese- und Schreibvorgänge nicht mehr im Rahmen derselben Datenbanktransaktion ausgeführt, und ACID ist nicht mehr ausreichend.
Betrachten Sie zum Beispiel den folgenden Anwendungsfall:
![Application-level transactions and Optimistic Locking]()
Ohne optimistisches Sperren gibt es keine Möglichkeit, dass dieses verlorene Update abgefangen wird, selbst wenn die Datenbanktransaktionen Serializable verwenden. Der Grund dafür ist, dass Lese- und Schreibvorgänge in separaten HTTP-Anfragen und somit in verschiedenen Datenbanktransaktionen ausgeführt werden.
Optimistisches Sperren kann also dazu beitragen, verlorene Aktualisierungen zu verhindern, selbst wenn Sie Transaktionen auf Anwendungsebene verwenden, die auch die Denkzeit des Benutzers einbeziehen.
Schlussfolgerung
Optimistisches Sperren ist eine sehr nützliche Technik, die auch dann gut funktioniert, wenn weniger strenge Isolationsebenen wie Read Committed verwendet werden oder wenn Lese- und Schreibvorgänge in aufeinander folgenden Datenbanktransaktionen ausgeführt werden.
Der Nachteil des optimistischen Sperrens ist, dass ein Rollback durch das Datenzugriffs-Framework ausgelöst wird, wenn ein OptimisticLockException
Dadurch geht die gesamte Arbeit verloren, die zuvor von der aktuell ausgeführten Transaktion geleistet wurde.
Je mehr Streitigkeiten, desto mehr Konflikte und desto größer ist die Wahrscheinlichkeit, dass Transaktionen abgebrochen werden. Rollbacks können für das Datenbanksystem kostspielig sein, da es alle anstehenden Änderungen rückgängig machen muss, die sowohl Tabellenzeilen als auch Indexsätze betreffen können.
Aus diesem Grund ist das pessimistische Sperren bei häufigen Konflikten möglicherweise besser geeignet, da es die Wahrscheinlichkeit eines Rollbacks von Transaktionen verringert.
3 Stimmen
blog.couchbase.com/
3 Stimmen
Das ist eine gute Frage, insbesondere weil in Serialisierbarkeit Ich lese
At any technique type conflicts should be detected and considered, with similar overhead for both materialized and non-materialized conflicts
.4 Stimmen
Hier finden Sie eine gute Erklärung, hier auf SO, darüber, was die Grundlegendes Konzept der optimistischen Sperrung .
2 Stimmen
Ich würde empfehlen, das großartige Buch von Martin Fowler über Muster zu lesen: martinfowler.com/books/eaa.html
0 Stimmen
Ich denke, Gleichzeitigkeitskontrolle ist genauer als Sperren.