Java JPA和Services,如何防止Read在插入到同一实体期间运行

时间:2017-10-18 19:04:17

标签: java multithreading jpa transactions entity

我有2个线程调用相同的服务,如果不存在,可能需要插入表中的相同数据。

我有这样的批量电话:

@Async
    @Transactional(readOnly = false, timeout=100)
    public void adoptDealInBulk(List<String> adopters, ....)

这反过来为每个到applyDeal调用执行一个循环。

@Transactional(timeout=20)
adoptDeal(adopter)

首先查看是否已创建采用:

 adoptionService.findAdoption(adopter)

.... 如果不存在则创建并保存: ...

repository.save(adoption);

这是阅读通过:

@Transactional(readOnly = true)
findAdoption(adoption)

现在我已经尝试了通过电话:

@Transactional(timeout=Constant.ADOPT_OFFER_TIMEOUT, propagation = Propagation.REQUIRED)

在findAdoption上

@Transactional(readOnly = true, isolation = Isolation.SERIALIZABLE)

我知道它的性能很糟糕,但这不应该阻止读取而另一个线程正在进行插入吗?

但是,我仍然可以使用同一个新用户添加2个线程的dupe行。

我如何修复注释或添加其他内容以阻止读取并一次提交一个?

谢谢。

0 个答案:

没有答案