Im Grunde gibt es zwei gängige Antworten. Die erste sagt grundsätzlich
Optimistic benötigt eine dreistufige Architektur, bei der Sie nicht unbedingt eine Verbindung zur Datenbank für Ihre Sitzung aufrechterhalten müssen, während Pessimistic Locking bedeutet, dass Sie den Datensatz für Ihre ausschließliche Verwendung sperren, bis Sie ihn fertig bearbeitet haben. Es hat eine viel bessere Integrität als optimistisches Sperren Sie benötigen entweder eine direkte Verbindung zur Datenbank.
Eine andere Antwort lautet
optimistisch (Versionierung) ist schneller, weil es keine Sperren gibt, aber (pessimistische) Sperren sind besser, wenn es viele Konflikte gibt und es besser ist, die Arbeit zu verhindern, als sie zu verwerfen und neu zu beginnen.
oder
Optimistisches Sperren funktioniert am besten, wenn es seltene Kollisionen gibt.
Wie man es ausdrückt auf dieser Seite.
Ich habe meine Antwort verfasst, um zu erklären, wie "Verbindung halten" mit "wenig Kollisionen" zusammenhängt.
Um zu verstehen, welche Strategie für Sie am besten geeignet ist, denken Sie nicht an die Anzahl der Transaktionen pro Sekunde in Ihrer DB, sondern an die Dauer einer einzelnen Transaktion. Normalerweise öffnen Sie eine Transaktion, führen einen Vorgang aus und schließen die Transaktion. Dies ist eine kurze, klassische Transaktion, wie sie ANSI im Sinn hatte, und es ist in Ordnung, ohne Sperren auszukommen. Aber wie implementieren Sie ein Ticket-Reservierungssystem, bei dem viele Kunden gleichzeitig dieselben Räume/Sitzplätze reservieren?
Sie stöbern in den Angeboten und füllen das Formular mit vielen verfügbaren Optionen und aktuellen Preisen aus. Das nimmt viel Zeit in Anspruch, und die Optionen können veraltet sein, alle Preise sind ungültig, seit Sie mit dem Ausfüllen des Formulars begonnen und auf die Schaltfläche "Ich stimme zu" gedrückt haben, weil die Daten, auf die Sie zugegriffen haben, nicht gesperrt waren, und jemand anderes, der flinker ist, hat sich eingemischt und alle Preise geändert, und Sie müssen mit neuen Preisen neu beginnen.
Sie könnten stattdessen alle Optionen beim Lesen sperren. Das ist ein pessimistisches Szenario. Sie sehen, warum es scheiße ist. Ihr System kann von einem einzigen Clown zu Fall gebracht werden, der einfach eine Reservierung startet und dann raucht. Niemand kann etwas reservieren, bevor er fertig ist. Ihr Cashflow sinkt auf Null. Aus diesem Grund werden in der Realität optimistische Reservierungen vorgenommen. Diejenigen, die zu lange trödeln, müssen ihre Reservierung zu höheren Preisen neu starten.
Bei diesem optimistischen Ansatz müssen Sie alle Daten, die Sie lesen, aufzeichnen (wie in Mine Wiederholtes Lesen ) und kommen Sie zum Commit-Punkt mit Ihrer Version der Daten (ich möchte Aktien zu dem Preis kaufen, den Sie in diesem Angebot angezeigt haben, nicht zum aktuellen Preis). An diesem Punkt wird eine ANSI-Transaktion erstellt, die die DB sperrt, prüft, ob sich nichts geändert hat, und Ihre Operation festschreibt/abbricht. IMO ist dies eine effektive Emulation von MVCC die ebenfalls mit Optimistic CC verbunden ist und ebenfalls davon ausgeht, dass Ihre Transaktion im Falle eines Abbruchs neu beginnt, d. h. Sie nehmen eine neue Reservierung vor. Eine Transaktion beinhaltet hier eine menschliche Benutzerentscheidung.
Ich bin weit davon entfernt zu verstehen, wie man das MVCC manuell implementieren kann, aber ich denke, dass lang laufende Transaktionen mit der Möglichkeit des Neustarts der Schlüssel zum Verständnis des Themas sind. Korrigieren Sie mich, wenn ich irgendwo falsch liege. Meine Antwort wurde motiviert durch dieses Kapitel von Alex Kuznecov .
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.