我在 Hibernate 查询中遇到问题,需要使用 PESSIMISTIC_WRITE 锁。锁在并发事务中工作正常,但查询返回的信息已过时。为了确保数据是最新的,我必须在 EntityManager 上调用刷新,我希望避免这种情况。
这是我正在使用的代码:
public Account findByCodeWithLock(String code) throws Exception {
TypedQuery<Account> query = em.createQuery("select a from Account a where a.accountCode = :code", Account.class);
query.setParameter("code", code);
query.setLockMode(LockModeType.PESSIMISTIC_WRITE);
logger.info("lock");
Account account = query.getSingleResult();
logger.info("getSingleResult: {}", account.getBalanceAmount());
em.refresh(account);
logger.info("refresh: {}", account.getBalanceAmount());
return account;
}
我也尝试过使用一些提示,例如:
query.setHint("org.hibernate.cacheable", false);
query.setHint("javax.persistence.cache.storeMode", CacheStoreMode.REFRESH);
query.setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);
然而,我并没有成功。谁能帮我解决这个问题吗?
注意:我使用 Java 8 和 Oracle 数据库。
我尝试使用PESSIMISTIC_WRITE锁来保证并发事务中的数据一致性。我还尝试了各种 Hibernate 提示来管理数据新鲜度,但这些方法都没有解决问题。我预计使用 PESSIMISTIC_WRITE 锁会自动保持数据最新,并避免需要手动调用 EntityManager.refresh 来同步实体状态。
检查日志中
org.hibernate
级别的TRACE
。它会让您了解到底发生了什么