2016-08-01 11 views
0

Ich bin auf der Suche nach einer Möglichkeit, eine Entität in einer DB zu speichern und sofort sperren, um zu vermeiden, dass andere Thread auf die Entität zugreifen, bevor der Thread-Ersteller endet.
Ich benutze Hibernate 4.3.11 und Spring 4.2.5.
Vielen Dank im Voraus.Speichern und Sperren von Entity mit Hibernate

Antwort

0

Ein möglicher Weg sollte Transaktion Ebene zu Serialisierung erhöhen. Diese Ebene stellt sicher, dass Daten gesperrt sind, bis sie in anderen Transaktionen nicht verwendet werden.

+0

Vielen Dank für Ihre Antwort. Auf diese Weise wird die gesamte Tabelle gesperrt. Ich möchte nur die neue Entität sperren. – nuno

+0

Je höher die Isolationsstufe, desto niedriger die Leistung. –

0

Obwohl es Sperrmodus - LockMode.WRITE - sondern der Dokumentation wird

eine Schreibsperre erhalten wird, wenn ein Objekt aktualisiert wird oder eingesetzt ist. Dieser Lock-Modus ist nur für internen Gebrauch und ist kein gültiger Modus für Last() oder Schloss() (die beiden Ausnahmen auslösen, wenn WRITE angegeben ist) ..

Wenn es nur, dass Sie nur sind Wenn Sie Zeilen einfügen, können Sie die Datenbankzeilen nicht mit hibernate sperren, da die Zeilen noch nicht festgeschrieben sind. In dem Moment, in dem Ihr Code (Hibernate oder ohne) Zeilen in die Datenbank einfügt und noch nicht festschreibt, werden transaktionale Sperren gehalten, die beim Transaktions-Commit freigegeben werden. Die Art der Sperren und die Art und Weise, wie dies intern geschieht, ist datenbankspezifisch. Wenn Sie jedoch in Sperr einige Zeilen interessiert sind (bereits vorhandenen), dann Sie die Daten abfragen können

session.get(TestEntity.class, 1, LockMode.PESSIMISTIC_WRITE); 

Dies wird halten eine pessimistische Sperre (normalerweise durch SELECT Ausgabe .... FOR UPDATE) für die Dauer der Transaktion und kein anderer Thread/Transaktion kann die Daten ändern, für die die Sperre ausgeführt wurde.

0

Hibernate Angebot zwei Arten von Schlössern Optimistisch und pessimistisch. Es ist geradlinig.

1) Optimistisch Anwendungen Versionierung, wo in eine Versionsspalte in der Datenbank es haben wird, und überprüfen, bevor es aktualisiert oder aber die Ausnahme werfen

2) Pessimistisch ist soetwas wie eine Datenbank auf dieser Zeile die Verriegelungsgriffe und es wird frei bekommen, nachdem der Vorgang abgeschlossen ist, gibt es nur wenige Möglichkeiten gibt es, das ist ähnlich wie wie Sie wie Lesesperre vorstellen, schreiben sperren

https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html

Verwandte Themen