多次请求事务未提交导致的数据重复入库问题

起因

最近的一次开发中,请求过来要判断数据是否存在,不存在则入库。由于是循环有着相同的数据入库请求,在执行时上一次事务还未提交,第二次的请求在数据库查询判断时发现数据不存在,又执行了一次入库请求,导致数据重复插入。以下列出了几种处理这种问题的思路,以后完善具体方案

使用消息队列

以kafka为例,可以在controller层不进行入库操作,将处理好的数据封装成对象发送一条kafka消息。再定义一个消费者去执行,由于消费者是有序执行。不会出现类似事务提交问题。

redis锁 / 内存缓存

执行插入操作时,向redis塞一条数据,等下次请求进来时,判断redis是否有相同数据,有的话则不进行插入操作。内存缓存同理。

数据库设置唯一键

在数据库对于相同数据的特征字段设置unique key,同时在代码里面捕获这个异常但不处理。这样重复数据不会插入,并且不会影响代码执行。这个方法有一定的局限性,数据库的唯一键限制了长度。在我的需求里面不适合使用。

方法加锁(synchronized)

影响效率,不推荐。无并发场景可以使用。

insert … where …

简而言之就是在数据入库的时候,通过sql判断当条数据是否存在,可以取某些特征字段 如name之类的,置于where 后面去判断

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值