码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-08-20 18:30:12      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:其他   修改   mys   insert   操作   ted   key   配置   service   

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

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

修改代码如下:

all.forEach(item -> {
     // 清空数据
     TestDTO.setId(null);
     TestDTO.setName(null);
     TestDTO.setValue(null);
     TestDTO.setTime(null);
     // ... 下面是一系列的业务逻辑

     // 插入数据库
     TestManager.insert(TestDTO);
 }

修改上面的代码, 每次在清空数据之前, 都需要把Id进行清空, 这样就可以解决掉了, 而我们每次插入数据库, 都是新建一个对象, 新建的对象的Id都是默认是没有值的, 如果想我们这样的方式清空, 就出现了的问题, 如果想对象的重复利用, 就必须把id设置为null,这样我们就可以重复利用了, 如果不删除, 你就会发现, 你第二次进行插入的时候, Id是带有数据的, 如果其他线程已经插入了数据库, 这个时候肯定是就会报主键冲突

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

标签:其他   修改   mys   insert   操作   ted   key   配置   service   

原文地址:https://blog.51cto.com/14901322/2521150

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!