Spring Boot 2.7升级后Hibernate批量更新触发主键重复约束异常
Spring Boot 2.5 迁移至2.7后批量更新触发主键重复异常问题
问题现象
将Spring Boot从2.5版本迁移到2.7版本后,系统偶尔会抛出SQLIntegrityConstraintViolation主键重复异常。调试发现,当尝试批量更新15条记录时,某一条记录会被重复更新14-15次,导致负责将数据同步到h_instance表的数据库触发器触发主键重复校验错误。
触发场景
触发异常的是一个常规业务方法:
- 根据指定的rateId和locationId查询Instance记录
- 修改记录字段后调用
instanceRepo.saveAll()批量保存 - 每次处理的记录数在5-100条之间,传入的rateIds是Set集合,不存在重复值
特殊情况:使用单条save()保存,或者将hibernate.jdbc.batch_size设置为1时,不会出现该异常。
环境信息
- Hibernate版本:5.6.15_Final
- MariaDB版本:10.6
- Spring Boot版本:2.7
- MariaDB JDBC客户端版本:3.3.3
已配置内容与数据库触发器
Hibernate批量更新配置
已开启以下批量相关属性:
hibernate.order_inserts=truehibernate.order_updates=truehibernate.jdbc.batch_size=20
数据库触发器
数据库中存在两类触发器:
- 前置触发器:更新ATTRCHANGEID字段为UUID
- 后置触发器:将数据插入t_datalog表
日志排查结果
查看Hibernate日志,仅生成了一条针对异常rateId的更新语句,但数据库触发器却检测到该记录被重复更新。
内容的提问来源于stack exchange,提问作者Rudy
相关产品推荐
相关产品推荐

