Hibernate:如何在不使用 EntityManager.refresh 的情况下使用 PESSIMISTIC_WRITE 锁确保更新数据?

问题描述 投票:0回答:1

我在 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 来同步实体状态。

java oracle hibernate jpa entitymanager
1个回答
0
投票

检查日志中

org.hibernate
级别的
TRACE
。它会让您了解到底发生了什么

© www.soinside.com 2019 - 2024. All rights reserved.