我正在使用Spring Boot和And Spring Data开发使用微服务架构的应用程序。在我的情况下,微服务具有这样的存储库
@Repository
public interface JobInfoRepository extends JpaRepository<JobInfo, UUID>, JpaSpecificationExecutor<JobInfo> {
boolean existsByNameAndOrganization(String name, UUID organization);
boolean existsByIdNotAndNameAndOrganization(UUID id, String name, UUID organization);
}
使用此存储库的服务方法
@HystrixCommand
public JobInfo save(JobInfo entity) {
if (repository.existsByNameAndOrganization(entity.getName(), entity.getOrganization())) throw new ValueAlreadyExistException(entity.getName());
return repository.save(entity);
}
当我同时调用此服务方法时, existsByNameAndOrganization 方法返回false。第一个线程可以在数据库中创建一条记录。在第二个线程之后,线程可以创建另一个具有相同名称的记录。防止这种行为的正确方法是什么?
答案 0 :(得分:1)
调用EntityManager.persist()
而不是调用save()
,如果实体已经存在,则会调用EntityExistsException
。
您还可以在mysql中创建一个唯一的约束,并按名称和组织编制索引。