2012-04-12 9 views
11

Ich habe eine Frage über optimistisches Sperren in Hibernate. Ich versuche tief in den optimistischen Locking mit Hibernate zu gehen, aber ich habe einen Zweifel. Hibernate verwendet den Versionsansatz (Integer oder Timestamp), um das optimistische Sperren zu implementieren. Zur Konfiguration können Sie die Annotation @Version (oder XML-Konfiguration) verwenden und ein Versionsattribut erstellen. Die andere Option ist die Konfiguration ohne Versionierung mit dem Attribut optimistic-lock = "all".Optimistische Sperre im Ruhezustand standardmäßig

Meine Frage ist, falls Sie kein Versionierungsattribut definieren und auch kein optimistisches Sperrattribut angeben, welche Strategie in diesen Fällen Hibernate verwendet? Pessimistc Locking Ich bin mir ziemlich sicher, dass nein, also ich vermute, dass ist optimistisch sperren, aber weiß nicht wie.

Vielen Dank für Ihre Aufmerksamkeit.

Antwort

33

Wenn Sie Hibernate nicht für optimistisches Sperren konfigurieren, wird keine Sperre verwendet. In diesem Fall gewinnt also das letzte Update immer.

Um es klar zu stellen, beachten Sie, dass das optimistic locking von Hibernate vollständig von der DBMS-Transaktionsisolation abweicht. Das Optimieren des Ruhemodus funktioniert nur, wenn Sie das Objekt in einer Transaktion laden, ändern und später in einer anderen Transaktion speichern. In diesem Fall stellt das optimistische Sperren sicher, dass einige andere Transaktionen das Objekt in der Datenbank dazwischen nicht geändert haben. Das optimistische Sperren wirkt sich jedoch nicht auf die Isolation gleichzeitiger Transaktionen aus. Sperren (optimistisch oder pessimistisch), die von DBMS zur Implementierung der Transaktionsisolation verwendet werden, funktionieren also immer noch, unabhängig davon, ob die Ruhezustandssperre aktiviert ist oder nicht.

3

@axtavt, Sie haben Recht, aber Frage darüber, wie Hibernate optimistisches Sperren ohne @Version Spalte implementieren.

heute vier OptimisticLockType Optionen zur Verfügung:

/** 
* Perform no optimistic locking. 
*/ 
NONE, 
/** 
* Perform optimistic locking using a dedicated version column. 
* 
* @see javax.persistence.Version 
*/ 
VERSION, 
/** 
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
DIRTY, 
/** 
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the 
* UPDATE/DELETE SQL statement. 
*/ 
ALL 

Ich denke, das genug ist, um die ursprüngliche Frage zu beantworten.