在执行 GPS 分段里程计算时,系统抛出以下异常:
org.springframework.jdbc.UncategorizedSQLException:
### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '9-2026-03-15 06:10:00' for key 'tb_vehicle_gps_segment_mileage.uk_vehicle_time'
数据库表 tb_vehicle_gps_segment_mileage 定义了唯一索引 uk_vehicle_time (vehicle_id, segment_start_time),用于确保同一车辆在同一时间段的分段里程记录只有一条。
虽然在代码层面(VehicleGpsSegmentMileageServiceImpl.java 第 390 行)已经有检查逻辑:
if (isSegmentAlreadyCalculated(vehicleId, segmentStartTime, segmentGpsList)) {
previousSegmentLastPoint = segmentGpsList.get(segmentGpsList.size() - 1);
continue;
}
但在**并发场景**下,仍可能出现竞态条件(Race Condition):
修改 MyBatis Mapper XML 文件中的 INSERT 语句,使用 MySQL 的 ON DUPLICATE KEY UPDATE 语法:
ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xml在原有的 insertVehicleGpsSegmentMileage 方法中添加 ON DUPLICATE KEY UPDATE 子句:
<insert id="insertVehicleGpsSegmentMileage" parameterType="VehicleGpsSegmentMileage">
INSERT INTO tb_vehicle_gps_segment_mileage
<trim prefix="(" suffix=")" suffixOverrides=",">
<!-- 字段列表 -->
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<!-- 值列表 -->
</trim>
ON DUPLICATE KEY UPDATE
vehicle_no = VALUES(vehicle_no),
segment_end_time = VALUES(segment_end_time),
start_longitude = VALUES(start_longitude),
start_latitude = VALUES(start_latitude),
end_longitude = VALUES(end_longitude),
end_latitude = VALUES(end_latitude),
segment_distance = VALUES(segment_distance),
gps_point_count = VALUES(gps_point_count),
gps_ids = VALUES(gps_ids),
task_id = VALUES(task_id),
task_code = VALUES(task_code),
calculate_method = VALUES(calculate_method),
update_time = NOW()
</insert>
使用 ON DUPLICATE KEY UPDATE 的好处:
tb_vehicle_gps_segment_mileageinsertVehicleGpsSegmentMileage 的方法ruoyi-system/src/main/resources/mapper/system/VehicleGpsSegmentMileageMapper.xmlruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleGpsSegmentMileageServiceImpl.javaruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleGpsSegmentMileage.javasql/vehicle_gps_segment_mileage.sql修复日期: 2026-03-16
修复人员: AI Assistant
问题类型: 并发数据一致性