REQUIRES_NEW交易后,乐观锁失败

问题描述

在以下情况下:两个Spring Bean ServiceA和ServiceB,ServiceA加载一个实体,然后调用Bean ServiceB的方法,该方法加载并保存相同的实体。

ServiceB方法完成后,将提交事务,并将实体版本从1移到2。 在该调用之后,如果我尝试再次加载ServiceA版本中的相同实体,则该实体仍为1。 当然,这会导致在ServiceA中进行保存调用时出现以下异常:

乐观锁定失败;嵌套的异常是org.hibernate.StaleObjectStateException:行已由另一个事务更新或删除(或未保存的值映射不正确)

@Service
public class ServiceA {

    @Autowired
    private ServiceB serviceB;

    @Autowired
    private MyEntityRepository repo;

    @Transactional
    public void myMethod(Long id) {
        MyEntity e = repo.findById(id); -> version 1
        serviceB.doStuff(id);
        e = repo.findById(id); -> still version 1
        ...
        saveAndFlush(e); -> optimistic lock error
    }
}

@Service
public class ServiceB {

    @Autowired
    private MyEntityRepository repo;

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void doStuff(Long id) {
        MyEntity e = repo.findById(id) -> version 1
        ...
        repo.saveAndFlush(e); -> version 2
    }
}

使它工作的唯一方法是在doStuff()调用之后在ServiceA中分离实体,但是它看起来是一个肮脏的解决方案。有更好的解决方案吗?

使用的版本是:

  • 休眠:5.4.6.FINAL
  • JPA春季数据:2.2.0.RELEASE

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...