2012-11-26 5 views
16

Mit JPA können wir manuell OPTIMISTIC oder PESSIMISTIC Sperren verwenden, um Entitätsänderungen in Transaktionen zu behandeln.JPA und Standardsperrmodus

Ich frage mich, wie JPA Sperren funktioniert, wenn wir keinen dieser beiden Modi angeben? Kein Sperrmodus?

Wenn wir keinen expliziten Sperrmodus definieren, kann die Integrität der Datenbank verloren gehen?

Dank

Antwort

13

Ich habe 3.4.4 Sperrmodi der Java Persistence API 2.0 Final Release Spezifikation durch den Bereich gescannt und während ich nichts spezifische finden kann (es gibt nicht an, dass diese ist die Standardeinstellung oder so ähnlich) gibt es eine Fußnote, die folgendes sagt.

Der Sperrmodus Typ NONE kann als ein Wert des Sperrmodus Argumente und liefert auch einen Standardwert für Annotationen angegeben werden.

Der Abschnitt ist über die Arten von LockModeType Werte verfügbar und deren Verwendungen und beschreibt, welche Methoden ein Argument dieser Art und was nicht.

So, wie es gesagt LockModeType.NONE Standard für Anmerkungen ist (JPA, Anmerkungen links und rechts) Ich denke, wenn Sie EntityManager.find(Class, Object) der Standard LockModeType verwenden verwendet wird.

Es gibt einige andere, subtile, Hinweise, um dies zu verstärken. Abschnitt 3.1.1 Schnittstelle des EntityManagers.

Die Methode Suchen (vorausgesetzt, es ist ohne Sperre oder aufgerufen mit LockModeType.NONE aufgerufen wird) und die getReference Verfahren sind nicht als erforderlich aufgerufen innerhalb eines Transaktionskontextes.

Es macht Sinn. Wenn Sie beispielsweise MySQL als Datenbank verwenden und InnoDB die bevorzugte Datenbank-Engine ist, dann verwenden Ihre Tabellen (standardmäßig) REPEATABLE READ. Wenn Sie ein anderes RDBMS oder andere Datenbank-Engines verwenden, kann sich dies ändern.

Im Moment bin ich nicht genau sicher, dass Isolationsstufen etwas mit JPA - Sperrmodi zu tun haben (obwohl es so scheint), aber mein Punkt ist, dass verschiedene Datenbanksysteme abweichen, so JPA kann nicht für Sie entscheiden (at mindestens nach der Spezifikation), welcher Sperrmodus standardmäßig verwendet wird, so dass LockModeType.NONE verwendet wird, wenn Sie es nicht anders anweisen.

Ich habe auch an article regarding isolation levels and lock modes gefunden, möchten Sie vielleicht lesen.

Oh, und Ihre letzte Frage zu beantworten. Wenn wir keinen expliziten Sperrmodus definieren, kann die Integrität der Datenbank verloren gehen?

Es hängt, aber wenn Sie gleichzeitige Transaktionen haben dann die Antwort ist wahrscheinlich ja .

+0

Vielen Dank für diese konstruktive Antwort und Link. Ich werde wieder lesen und versuchen, LockModeType.NONE zu verstehen und was das bedeutet. Tatsache ist, dass ich mit JPA neu bin und nicht genau weiß, welche Entity (n) ich sperren sollte, um mit der Integrität der Integrität zu bleiben. Es ist wahrscheinlich langweilig, aber ich werde alle Modi mit Transaktionen Simulation (Thread.sleep()) testen. Danke noch einmal –

9

Aufgrund JPA 2.1 FR

3,2 Version Attribut

Das Feld Version oder das Eigentum von den Persistenz-Provider verwendet wird, optimistische Sperren durchzuführen. Auf diesen Persistenzanbieter wird während der Ausführung von Lebenszyklusoperationen für die Entitätsinstanz zugegriffen bzw. von diesen gesetzt. Eine Entität wird automatisch für optimistisches Sperren aktiviert, wenn eine Eigenschaft oder ein Feld einer Versionszuordnung zugeordnet ist.

Also, wenn das Unternehmen ein versioniert Objekt, wie ein @Version angegeben wurde, dann wird die Standard-Persistenz-Provider optimistische Sperren durchführen.

3

In der Beschreibung persistence_2.0, Seite 89:

Wenn ein Objekt versioniert sonst aktualisiert oder entfernt wird, dann muss die Implementierung sicherstellen, dass die Anforderungen von LockModeType.OPTIMISTIC_FORCE_INCREMENT erfüllt werden, auch wenn keine expliziten Aufruf an EntityManager.lock wurde gemacht.

0

Formular der Antworten zuvor hier vorgelegt, wie es scheint, JPA die folgende Art und Weise verhält: Wenn mein Unternehmen eine @Version kommentierten Feld hat eine nicht LockModeType gesetzt wurde, dann wird LockModeType.OPTIMISTIC_FORCE_INCREMENT standardmäßig eingestellt werden. Ist das richtig ?