Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "EclipseLink/Development/JPA 2.0/pessimistic locking"
(→Usage matrix) |
(→Usage matrix) |
||
Line 18: | Line 18: | ||
====find(Class<T>, Object)==== | ====find(Class<T>, Object)==== | ||
#Uses no locking | #Uses no locking | ||
− | #Will use a javax.persistence.lock.timeout setting from the EntityManager settings | + | #Will NOT use a javax.persistence.lock.timeout setting from the EntityManager settings as it does not apply in this case where no pessimistic locking is being used. |
====find(Class<T>, Object, LockModeType)==== | ====find(Class<T>, Object, LockModeType)==== | ||
#Uses the lock mode specified | #Uses the lock mode specified | ||
+ | #A javax.persistence.lock.timeout setting from the EntityManager settings will be used if available on the find query (internally it will set the query timeout value) | ||
#If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown. | #If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown. | ||
− | |||
#Whenever a pessimistic lock is used on an entity that contains a version attribute, that attribute will be updated (incremented) | #Whenever a pessimistic lock is used on an entity that contains a version attribute, that attribute will be updated (incremented) | ||
Revision as of 10:35, 16 October 2008
Contents
- 1 Lock Modes / Pessimistic Locking
- 1.1 Issue Summary
- 1.2 General Solution
- 1.3 Usage matrix
- 1.3.1 EntityManager
- 1.3.1.1 find(Class<T>, Object)
- 1.3.1.2 find(Class<T>, Object, LockModeType)
- 1.3.1.3 find(Class<T>, Object, LockModeType, Map)
- 1.3.1.4 lock(Object, LockModeType)
- 1.3.1.5 lock(Object, LockModeType, Map)
- 1.3.1.6 refresh(Object)
- 1.3.1.7 refresh(Object, LockModeType)
- 1.3.1.8 refresh(Object, LockModeType, Map)
- 1.3.2 Query Interface
- 1.3.1 EntityManager
- 1.4 Important Notes
- 1.5 Work Required
Lock Modes / Pessimistic Locking
JPA 2.0 Root | Enhancement Request
Issue Summary
In JPA 2.0 the specification extends Entity Manager lock mechanism to include explicit support for pessimistic locking. EntityManager and Query APIs have been updated with an additional query hint/persistence unit property. The specification has extensive detail on expected behaviour that must be implemented.
See JPA 2.0 ED section 3.4.3, 3.4.4, 3.6.3 and 3.6.4 for details.
General Solution
As EclipseLink includes Pessimistic Locking functionality this feature should be limited to comprehensive implementation of the JPA functionality and behaviour without many core changes. Pessimistic Locking and Optimistic Locking LockModesTypes must be covered, new query hint/persistence unit timeout properties and new Exceptions must be supported. As well, current query and Entity operations support must be updated to comply with new Pessimistic locking constraints.
Open Issues
Will Target table mappings (uni-directional OneToMany, ElementCollections) require that target rows also be locked?
Usage matrix
EntityManager
find(Class<T>, Object)
- Uses no locking
- Will NOT use a javax.persistence.lock.timeout setting from the EntityManager settings as it does not apply in this case where no pessimistic locking is being used.
find(Class<T>, Object, LockModeType)
- Uses the lock mode specified
- A javax.persistence.lock.timeout setting from the EntityManager settings will be used if available on the find query (internally it will set the query timeout value)
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.
- Whenever a pessimistic lock is used on an entity that contains a version attribute, that attribute will be updated (incremented)
find(Class<T>, Object, LockModeType, Map)
- Uses the lock mode specified
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the #locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.
- A javax.persistence.lock.timeout setting from the EntityManager settings will be not be used as it is assumed that the properties that are passed in are the strict set to be used with the find query.
- Whenever a pessimistic lock is used on an entity that contains a version attribute, that attribute will be updated (incremented)
lock(Object, LockModeType)
- Uses the lock mode specified
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.
- A javax.persistence.lock.timeout setting from the EntityManager settings will be used if available on the lock query.
- Whenever a pessimistic lock is used on an entity that contains a version attribute, that attribute will be updated (incremented)
lock(Object, LockModeType, Map)
- Uses the lock mode specified
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.
- A javax.persistence.lock.timeout setting from the EntityManager settings will be not be used as it is assumed that the properties that are passed in are the strict set to be used with the find query.
- Whenever a pessimistic lock is used on an entity that contains a version attribute, that attribute will be updated (incremented)
refresh(Object)
- Uses no locking
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the locking query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.
- A javax.persistence.lock.timeout setting from the EntityManager settings will be used if available on the lock query.
refresh(Object, LockModeType)
- Uses the lock mode specified
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the refresh query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.
refresh(Object, LockModeType, Map)
- Uses the lock mode specified
- If the PESSIMISTIC or PESSIMISTIC_FORCE_INCREMENT lock mode type is specified as and the javax.persistence.lock.timeout or eclipselink.jdbc.timeout hint is also specified, a javax.persistence.LockTimeoutException will be thrown if an exception is raised when issuing the refresh query. If no timeout hint is specified a javax,persistence.PessimisticLockException will be thrown.#A javax.persistence.lock.timeout setting from the EntityManager settings will be not be used as it is assumed that the properties that are passed in are the strict set to be used with the find query.
Query Interface
getResultList
getSingleResult
Important Notes
- Pessimistically locked object with version must still have version updated when entity is updated.
- A considerable amount of behaviour definition will be found in the java docs of the EntityManger and Query APIs
- for instance upon issuing a pessimistic lock call on find if the version from the database does not match that of the persistence context then an exception must be raised
Work Required
- Develop tests for testing access type settings
- approx 3 days
- Update Processing to process entire table
- approx 2 days - optimistic modes
- approx 4 days - pessimistic modes