我有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行。
我如何修复注释或添加其他内容以阻止读取并一次提交一个?
谢谢。