In the area of concurrency control, the JPA specification supports optimistic and pessimistic locking.
public void lock(Object entity, LockModeType mode);
This method locks the given entity using the named mode. The
jakarta.persistence.LockModeType
enum defines eight
modes:
OPTIMISTIC
: Optimistic locking.
OPTIMISTIC_FORCE_INCREMENT
: Optimistic locking.
When a transaction is committed, the entity's version column
will be incremented even if the entity's state did not change in the transaction.
PESSIMISTIC_READ
: Pessimistic locking. Other transactions
may concurrently read the entity, but cannot concurrently update it.
PESSIMISTIC_WRITE
: Pessimistic locking. Other transactions
cannot concurrently read or write the entity.
PESSIMISTIC_FORCE_INCREMENT
: Pessimistic locking. Other transactions
cannot concurrently read or write the entity.
When a transaction is committed, the entity's version column
will be incremented even if the entity's state did not change in the transaction.
READ
: A synonym for OPTIMISTIC
.
WRITE
: A synonym for OPTIMISTIC_FORCE_INCREMENT
.
NONE
: No locking is performed.
Entities can also be locked at the time when entity state gets loaded from the datastore.
This is achieved by supplying a lock mode to the respective versions of
find
and refresh
methods.
If an entity state is to be loaded by a query, a lock mode can be passed to the
Query.setLockMode
and TypedQuery.setLockMode
methods.
public LockModeType getLockMode(Object entity);
Returns the lock mode currently held by the given entity.
OpenJPA differentiates between PESSIMISTIC_READ
and
PESSIMISTIC_WRITE
lock modes only with DB2 databases.
While running with other databases, there is no distinction between these
two modes because
PESSIMISTIC_READ
lock mode
is upgraded to PESSIMISTIC_WRITE
.
OpenJPA has additional APIs for controlling entity locking. See Section 3, “ Object Locking ” in the Reference Guide for details.