如何防止并发请求findByName方法?

时间:2018-07-06 20:07:19

标签: mysql multithreading hibernate spring-boot

我正在使用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。第一个线程可以在数据库中创建一条记录。在第二个线程之后,线程可以创建另一个具有相同名称的记录。防止这种行为的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

调用EntityManager.persist()而不是调用save(),如果实体已经存在,则会调用EntityExistsException

您还可以在mysql中创建一个唯一的约束,并按名称和组织编制索引。