我有下一个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。