我已经搜索了stackoverflow中的帖子,我希望这不是重复的。
我第一次尝试乐观锁定,我可以使用 spring 管理的 LockModeType 来做到这一点,但无法自己定义 LockMode
以下是代码示例:
我正在使用以下方法注入持久性上下文:
@PersistenceContext
private EntityManager entityManager;
第一种方法:使用注释事务
@Transactional
public void updateUserProfile(UserProfile userProfile) {
entityManager.lock(userProfile, LockModeType.OPTIMISTIC); // 1*
entityManager.merge(userProfile);
}
1 处的例外情况:java.lang.IllegalArgumentException: entity not in the persistence context
第二种方法:管理事务
public void updateUserProfile(UserProfile userProfile) {
entityManager.getTransaction().begin(); // 2*
entityManager.lock(userProfile, LockModeType.OPTIMISTIC);
entityManager.merge(userProfile);
entityManager.getTransaction().commit();
}
2 处的例外情况:Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
第三种方法:由于共享 entityManager 出现异常,我还尝试从 entityManagerFactory 创建 EntityManager。
@Transactional
public void updateUserProfile(UserProfile userProfile) {
EntityManager em = entityManager.getEntityManagerFactory().createEntityManager();
em.getTransaction().begin();
em.lock(userProfile, LockModeType.OPTIMISTIC); // 3*
em.merge(userProfile);
em.getTransaction().commit();
}
3 处的例外情况:entity not in the persistence context
在我的应用程序上下文中,我org.springframework.orm.jpa.JpaTransactionManager
用于定义transactionManager
和org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
定义entityManagerFactory
提前致谢!