【发布时间】:2018-07-30 19:32:58
【问题描述】:
我正在使用 Spring Boot、JPA、Oracle 12C 和下面的类型化查询来选择要处理的“新”项目。选择“新”项目后,我会更新其状态,使其不再符合选择条件,但我发现相同项目被拾取时出现并发问题。
我读到here,我需要在查询中设置“LockModeType.PESSIMISTIC_WRITE”以防止其他线程选择同一行,但它似乎不起作用。
我是否遗漏了以下内容,或者我是否需要其他配置来防止并发线程从我的表中检索相同的行?问题与锁定级别或实体管理器没有更新/刷新有关吗?
我的@Transactional服务:
@Override
@Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor=RuntimeException.class)
public MyObject retrieveItemByStatus(StatusEnum status) {
return myRepository.retrieveItemByStatus(status);
}
我的存储库层中的查询:
@Override
public MyObject retrieveItemByStatus(StatusEnum status) {
String sql = "SELECT t FROM myTable t WHERE status = :status ORDER BY id ASC";
try {
TypedQuery<MyObject> query = em.createQuery(sql, MyObject.class).setParameter("status", status);
query.setLockMode(LockModeType.PESSIMISTIC_WRITE);
query.setFirstResult(0);
query.setMaxResults(1);
MyObject myObject = (MyObject) query.getSingleResult();
if (myObject != null) {
myObject.setStatus(StatusEnum.IN_PROGRESS);
MyObject myUpdatedObject = em.merge(myObject);
return myUpdatedObject;
}
} catch (IllegalArgumentException iae) {
//some logging
} catch(NoResultException nrf) {
//some logging
} catch(Exception ex) {
//some logging
}
return null;
}
【问题讨论】:
标签: oracle hibernate jpa transactions locking