一行代码引发的思考-mybatis的自增主键冲突

在使用Kafka作为消息队列,多个消费者并行处理数据并插入MySQL表时,遇到自增主键冲突的问题。原来在清空数据但未重置Id的情况下,旧的Id可能导致主键冲突。解决方案是在清空数据前将Id设为null,确保每次插入都使用新的对象或清空Id,避免主键冲突。
摘要由CSDN通过智能技术生成

昨天在开发的过程中,自己设计的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);
 }

在上面的代码中, 插入数据库报主键冲突, 本来我怀疑是消费者多线程并发导致的, 排查了很久, 一直定位不到问题, 后来经过同事的提醒, 自己终于醍醐灌顶, 感觉找到了问题,

修改代码如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值