Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Behandlung gleichzeitiger Updates im Ruhezustand

Kann mir jemand erklären, ob wir Spring für die Transaktionsverwaltung verwenden, wie gleichzeitige Aktualisierungen von Hibernate gehandhabt werden (automatische Versionsverwaltung im Arbeitsspeicher von Hibernate) oder ob ich eine Versionsspalte in die Datenbank einfügen muss, um mich manuell um gleichzeitige Aktualisierungen zu kümmern. P>

Ob Sie Spring für das Transaktionsmanagement verwenden oder nicht, spielt keine Rolle und ist nicht relevant, wenn es um das Concurrency-Management geht, dies wird tatsächlich von Hibernate gehandhabt. Hibernate kann 2 Strategien verwenden, um gleichzeitige Updates zu handhaben:optimistisches Sperren und pessimistisches Sperren.

Optimistisch

Wenn Sie optimistisches Sperren verwenden, ordnen Sie ein spezielles Attribut (eine Zahl, ein Zeitstempel) als Version zu (Sie haben also tatsächlich eine Spalte dafür). Diese Version wird gelesen, wenn Sie eine Entität abrufen und einschließen in der where-Klausel während einer Aktualisierung und inkrementiert von Hibernate.

Um zu veranschaulichen, wie dies funktioniert, stellen wir uns vor, Sie laden eine Person-Entität mit id=1 und mit einer aktuellen Version=1. Nach dem Speichern führt Hibernate etwa Folgendes aus:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Stellen Sie sich nun vor, Sie haben zwei gleichzeitige Transaktionen, die jeweils dasselbe laden Einheit (gleiche Versionsnummer) und Namensänderung.

Nehmen wir an, Transaktion Nr. 1 wird zuerst festgeschrieben, die folgende Abfrage wird durchgeführt:

update PERSON set ID=1, NAME='NAME 1', VERSION=2 where ID=1 and VERSION=1;

Es ist erfolgreich und die Version wird erhöht.

Dann wird Transaktion Nr. 2 festgeschrieben, die folgende Abfrage wird durchgeführt:

update PERSON set ID=1, NAME='NAME 2', VERSION=2 where ID=1 and VERSION=1;

Dieser wird nichts aktualisieren, da die where-Klausel mit keinem Datensatz übereinstimmt. An dieser Stelle erhalten Sie eine optimistische Nebenläufigkeitsausnahme.

Diese Strategie ist geeignet, wenn Sie die Verbindung nicht aufrechterhalten, wenn gleichzeitige Zugriffe nicht häufig sind, und lässt sich sehr gut skalieren. Und natürlich wird alles transparent von Hibernate für Sie gehandhabt, solange Sie ein Versionsattribut zuordnen.

Pessimistisch

Wenn Sie pessimistisches Sperren verwenden, sperrt Hibernate einen Datensatz für Ihre ausschließliche Verwendung, bis Sie damit fertig sind (normalerweise mit einem SELECT ... FOR UPDATE ). Jede andere gleichzeitige Transaktion, die versucht, auf denselben Datensatz zuzugreifen, wird ausgesetzt, bis die Sperre entfernt wird. Diese Strategie bietet eine bessere Vorhersagbarkeit auf Kosten der Leistung und lässt sich nicht unbegrenzt skalieren.

Referenzen

  • Hibernate Core-Referenzhandbuch
    • 11.3. Optimistische Parallelitätssteuerung
    • 11.4. Pessimistisches Sperren