SpringDataJPA笔记(9)-使用transation注解引发的唯一索引冲突的问题
在业务中使用JPA的时候,因为业务逻辑比较复杂,使用了@Transactional 注解来确保事务一致性
在实际使用的时候却遇到了问题,最终发现 Hibernate 在实际执行SQL语句时并没有按照代码的顺序执行,而是按照 INSERT, UPDATE, DELETE的顺序执行的
原因是Hibernate 为了性能优化,不会直接将SQL语句提交给数据库,而是先放在缓存中,等commit的时候一起提交,利用batch操作提高数据库的性能,而这就导致了SQL的执行顺序与实际的代码顺序不一致,直接导致了代码抛出异常
复现错误过程如下
首先需要几个关键类
实体
@Data
@Entity
@Table(name = "nine_tb", uniqueConstraints = {
@UniqueConstraint(name = "name", columnNames={"firstName", "lastName"})
})
public class NineEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
private String remarks;
}
Repository
public interface NineRepository extends Base