昨天在开发的过程中,自己设计的mysql的一个表是自增主键, 但是在插入数据的过程中, 发现主键冲突。
具体如下:我们是通过kafka作为消息队列,三个consumer, 每个cosumer进行一些逻辑运算以后进行插入操作, 插入到表t_a表中, mybatis使用的下面配置
useGeneratedKeys="true" keyProperty="id"
servcie逻辑如下, 我们一次获取到多条插入数据库对象的数据, 这一批数据中, 有很多属性都是相同的, 但是有个别几个数据是不一样的, 每次插入之前, 都需要进行清空不一样的数据,在重新插入。
service的代码如下:
all.forEach(item -> {
// 清空数据
TestDTO.setName();
TestDTO.setValue();
TestDTO.setTime();
// ... 下面是一系列的业务逻辑
// 插入数据库
TestManager.insert(TestDTO);
}
在上面的代码中, 插入数据库报主键冲突, 本来我怀疑是消费者多线程并发导致的, 排查了很久, 一直定位不到问题, 后来经过同事的提醒, 自己终于醍醐灌顶, 感觉找到了问题,
修改代码如下: