从Spring数据存储库读取时发生StaleObjectStateException

时间:2018-08-01 08:03:06

标签: java hibernate transactions spring-data-jpa spring-data

我有下一个Java代码:

public Role reproduceIssue(String code) {
    repository.findOneByCode(code);
    roleChangedService.onRoleChanged(code);
    return null;
}

代码首先从存储库中按代码读取角色(在一个事务中,标记为只读),然后调用另一个方法RoleChangedService#onRoleChanged(在另一个事务中)。方法是这样的:

@Transactional
public void onRoleChanged(String code) {
    Role resource = roleRepository.findOneAndLockByCode(code);
    resource.setName(null);
    roleRepository.saveAndFlush(resource);
}

RoleRepository#findOneAndLockByCode带有@Lock(PESSIMISTIC_WRITE)注释。

每次发送2个并行HTTP请求以并行调用reproduceIssue方法时,在org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)方法调用中都会得到RoleRepository#findOneAndLockByCode

我想知道,鉴于我在此方法上使用了锁,怎么可能出现异常?

复制项目(以及模拟并行调用的shell脚本)可用here

0 个答案:

没有答案