在多个线程上运行的Spring Boot @Transactioanl方法

时间:2019-05-17 05:25:23

标签: spring-boot spring-data spring-transactions

在我的spring boot应用程序中,我并行运行以下@Transactioanl方法的多个线程。

@Transactional
public void run(Customer customer) {

    Customer customer = this.clientCustomerService.findByCustomerName(customer.getname());
    if(customer == null) {
        this.clientCustomerService.save(customer);
    }

    // another database oparations
}

当此方法同时在多个线程上运行时,由于在事务块结束之前不会保存客户对象,因此是否有可能在数据库中复制客户?

1 个答案:

答案 0 :(得分:1)

如果您的客户有一个@Id字段,该字段在“客户”数据库中定义了“主键”列,则该数据库将引发诸如javax.persistence.EntityExistsException之类的异常。即使您在某个时间点(也许在数据库级别)在多个线程上运行代码,也只有一个人会在新插入的行上获得一个锁。同样,您必须在顶级实体级别定义@Version列/字段,才能使用乐观锁定。您可以在here中找到有关此内容的更多详细信息。