应用程序将收到许多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