lock

Die Methode void lock(Object entity, LockModeType lockMode) gehört zum EntityManager Interface. Mit ihr kann eine Sperre für ein Entity gesetzt werden.

Es gibt fünf mögliche Sperrarten:

LockModeType.READ oder LockModeType.OPTIMISTIC - verhindert, dass andere Transaktionen Änderungen des Entities sehen, bevor diese festgeschrieben wurden und dass andere Transaktionen das Entity ändern oder löschen, nachdem es gelesen wurde

LockModeType.WRITE oder LockModeType.OPTIMISTIC_FORCE_INCREMENT - erhöht zusätzlich den Wert in der Versionsspalte für das Entity

LockModeType.PESSIMISTIC_READ - wie READ

LockModeType.PESSIMISTIC_WRITE - die beteiligten Transaktionen werden gezwungen, seriell nacheinander abzulaufen, d.h. eine wartet auf das Ende der anderen

LockModeType.PESSIMISTIC_FORCE_INCREMENT - wie PESSIMISTIC_WRITE, zusätzlich wird der Wert in der Versionsspalte des Entities erhöht

EntityManager müssen Aufrufe der Methode nur für versionierte Entities unterstützen (siehe @Version). Wenn beim Aufruf für ein nicht versioniertes Entity nicht ausgeführt werden kann, dann muss eine PersistenceException ausgelöst werden.

Die optimistischen und pessimistischen Methoden unterscheiden sich in der Weise, wie die beschriebenen Garantien erreicht werden. Optimistische Methoden lassen die Transaktionen weiterlaufen und verhindern ggf. später das Festschreiben einer Transaktion durch eine Ausnahme (OptimisticLockException). Die pessimistischen Methoden lassen eine Transaktion auf die andere warten. Auch hierbei können z.B. durch Timeouts Ausnahmen auftreten (LockTimeoutException oder DatabaseException).

Die optimistischen Methoden sind von Vorteil, wenn Konflikte zwischen Transaktionen selten sind. Wenn Konflikte häufig sind, wird die Abbruchquote der Transaktionen mit den optimistischen Methoden zu hoch. Dann müssen pessimistische Methoden verwendet werden.

Die JPA 1.0 unterstützt nur LockModeType.READ und LockModeType.WRITE.


Quelle

http://docs.oracle.com/javaee/6/api/javax/persistence/LockModeType.html