记多线程导致的一次事故

出于工作操守,代码就不贴出来,但是详细的过程可以进行分享。

需求,它来了

项目需求中进行一个促销活动的配置,大体就是进行人物画像,然后将符合画像的人群圈取出来后,定时进行短信发送投放,达到活动预热的效果。其中最主要的涉及到三个表(一个主表,两个附表)。

代码,它来了

实现过程:配置方法容易实现,本地库自己编写数据,稍微复杂的点在于需要调用ES查询圈取人数,和大批量的短信投放。
短信是定时任务实现,可以搞定;那么剩下的就是需求中需要统计出圈取人数,这个时间估计要2、3秒,可能更多。为了避免交互上的不友好,自然的想到了可以使用异步操作(我先把大部分配置信息写入,再异步查圈取人群的信息后,写入数据)

Bug,它来了

然后问题,他就来了:发现一个不是必现,但是出现的概率很高的bug。前一个线程中有update操作,编辑页面需要把之前的数据重写,1线程事务提交了还在update时,2异步线程的事务也到了,把还没update的数据读出来,修改好了之后,又把本该逻辑删除的数据写进去了,导致的结果就是数据重复了。

总结,它来了

定位到问题之后的解决办法:
类似上面的逻辑我们希望在事务结束后再执行某些业务。所以调用异步线程时可以使用TransactionSynchronizationManager.registerSynchronization。

总结:线程使用需谨慎呀!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值