Doppelte Frage von:
/programming/129329/optimistic-vs-pessimistic-locking
Antwort vom obigen Link kopieren / einfügen:
Optimistisches Sperren ist eine Strategie, bei der Sie einen Datensatz lesen, eine Versionsnummer notieren und überprüfen, ob sich die Version nicht geändert hat, bevor Sie den Datensatz zurückschreiben. Wenn Sie den Datensatz zurückschreiben, filtern Sie das Update nach der Version, um sicherzustellen, dass es atomar ist. (dh wurde nicht aktualisiert, wenn Sie die Version überprüfen und den Datensatz auf die Festplatte schreiben) und aktualisieren Sie die Version mit einem Schlag.
Wenn der Datensatz verschmutzt ist (dh eine andere Version als Ihre), brechen Sie die Transaktion ab und der Benutzer kann sie neu starten.
Diese Strategie eignet sich am besten für Systeme mit hohem Volumen und dreistufige Architekturen, bei denen Sie für Ihre Sitzung nicht unbedingt eine Verbindung zur Datenbank aufrechterhalten müssen. In dieser Situation kann der Client keine Datenbanksperren aufrechterhalten, da die Verbindungen aus einem Pool entnommen werden und Sie möglicherweise nicht dieselbe Verbindung von einem Zugriff zum nächsten verwenden.
Pessimistisches Sperren ist, wenn Sie den Datensatz für Ihre ausschließliche Verwendung sperren, bis Sie damit fertig sind. Es hat eine viel bessere Integrität als optimistisches Sperren, erfordert jedoch, dass Sie mit Ihrem Anwendungsdesign vorsichtig sind, um Deadlocks zu vermeiden. Um pessimistisches Sperren zu verwenden, benötigen Sie entweder eine direkte Verbindung zur Datenbank (wie dies normalerweise bei einer zweistufigen Client-Server-Anwendung der Fall ist) oder eine extern verfügbare Transaktions-ID, die unabhängig von der Verbindung verwendet werden kann.
Im letzteren Fall öffnen Sie die Transaktion mit der TxID und stellen dann mit dieser ID die Verbindung wieder her. Das DBMS verwaltet die Sperren und ermöglicht es Ihnen, die Sitzung über die TxID wieder aufzunehmen. So funktionieren verteilte Transaktionen mit zweiphasigen Festschreibungsprotokollen (z. B. XA- oder COM + -Transaktionen).
Bearbeiten (Hinzufügen weiterer Informationen zur Beantwortung der Leistungsfrage):
In Bezug auf die Leistung hängt es von Ihrer Umgebung ab. Berücksichtigen Sie die folgenden Faktoren, um zu entscheiden:
Sie werden feststellen, dass Optimismus aufgrund von Parallelität in den meisten Situationen besser ist. Abhängig vom RDBMS und der Umgebung kann dies jedoch weniger oder leistungsfähiger sein. In der Regel werden Sie beim Optimistic Locking feststellen, dass der Wert irgendwo zeilenversiert werden muss.
Bei MS SQL Server wird es beispielsweise in TempDB verschoben, und am Ende der Spalte werden zwischen 12 und 14 Byte angehängt. Das Aktivieren der optimistischen Sperrung mit einer Isolationsstufe wie Snapshot-Isolation kann zu einer Fragmentierung führen, und Ihr Füllfaktor muss angepasst werden, da die Zeilen jetzt zusätzliche Daten am Ende enthalten, die dazu führen können, dass eine Seite fast voll ist und sich die Seiten teilen deine Leistung. Wenn Ihre TempDB unteroptimiert ist, ist dies nicht so schnell.
Eine Checkliste lautet also:
- - Haben Sie genügend E / A / Ressourcen, um die Form der Zeilenversionierung zu handhaben? Wenn nicht, fügen Sie Overhead hinzu. Wenn ja, wenn Sie die Daten häufig lesen, während Sie sie häufig für Schreibvorgänge sperren, werden Sie eine gute Verbesserung der Parallelität zwischen Lese- und Schreibvorgängen feststellen (obwohl Schreibvorgänge Schreibvorgänge weiterhin blockieren, Lesevorgänge Schreibvorgänge nicht mehr blockieren und umgekehrt).
- - Ist Ihr Code anfällig für Deadlocks oder treten Sperren auf? Wenn Sie keine langen Sperren oder viele Deadlocks haben, würde der zusätzliche Aufwand für optimistisches Sperren die Dinge natürlich nicht schneller machen. In den meisten Fällen handelt es sich hier um Millisekunden.
- -Wenn Ihre Datenbank groß ist (oder auf sehr begrenzter Hardware) und Ihre Datenseiten je nach RDBMS nahezu voll sind, können Sie große Seitensplits und Datenfragmentierungen verursachen. Denken Sie also daran, nach dem Einschalten eine Neuindizierung in Betracht zu ziehen.
Das sind meine Gedanken zu diesem Thema, offen dafür, mehr von der Community zu hören.