我是靠谱客的博主 纯情胡萝卜,最近开发中收集的这篇文章主要介绍记多线程导致的一次事故,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

需求,它来了

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

代码,它来了

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

Bug,它来了

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

总结,它来了

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

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

最后

以上就是纯情胡萝卜为你收集整理的记多线程导致的一次事故的全部内容,希望文章能够帮你解决记多线程导致的一次事故所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部