在我的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
}
当此方法同时在多个线程上运行时,由于在事务块结束之前不会保存客户对象,因此是否有可能在数据库中复制客户?
答案 0 :(得分:1)
如果您的客户有一个@Id
字段,该字段在“客户”数据库中定义了“主键”列,则该数据库将引发诸如javax.persistence.EntityExistsException
之类的异常。即使您在某个时间点(也许在数据库级别)在多个线程上运行代码,也只有一个人会在新插入的行上获得一个锁。同样,您必须在顶级实体级别定义@Version
列/字段,才能使用乐观锁定。您可以在here中找到有关此内容的更多详细信息。