Spring Data实现CreateIfDoesntExist存储库方法,并发问题

时间:2017-12-01 12:40:25

标签: java spring jpa spring-boot spring-data

应用程序将收到许多REST调用,这些调用将导致创建许多#define个实体。许多这些实体将共享一个ID,该ID标识正在创建这些对象的特定item。我需要每个import作为其创建的一部分来检查item实体是否已经存在,如果不存在则应该创建它。

我试图实施"创建如果不存在" import存储库上的方法,但存在并发问题。第一个import调用该方法,该方法检查item是否存在。它返回0结果,因此调用import。但是,当第二个Save()再次调用此存储库方法时,item仍未创建。因此,它从查找返回0结果,并尝试再次创建import,由于数据库表上的唯一键约束而失败。

ImportRepository.java

import

ImportRepositoryCustom.java

@Repository
public interface ImportRepository extends 
ImportRepositoryCustom{

    List<Import> findByReference(String reference);

}

ImportRepositoryImpl.java

@Repository
public interface ImportRepositoryCustom {
    void saveIfNotExists(Import import);
}  

有没有办法确保@Repository public class ImportRepositoryImpl implements ImportRepositoryCustom{ @Autowired ImportRepository importRepository; public void saveIfNotExists(Import import){ if (importRepository.findByReference(import.getReference()).size() == 0){ importEventRepository.save(import); } } } 作为同一交易的一部分执行,以避免这种竞争条件?

Spring Boot 1.5.7

0 个答案:

没有答案