事务方法中发送异步消息,且事务方法中和消息处理逻辑都更新同一表导致数据错乱

事务方法中发送异步消息,且事务方法中和消息处理逻辑都更新同一表导致数据错乱

1.背景:
mysql数据库隔离级别:读已提交(非可重复读)
业务场景:活动审核通过后,更新活动状态(更新为报名开始)、活动场次状态(更新为报名开始),然后发送延时异步消息(在活动报名开始、报名结束、活动开始、活动结束各个时间节点投递消息)。消费者那里进行活动、活动场次各个环节的状态更新。
2.造成数据异常的现象:
审核通过后,活动场次表的活动报名开始时间应该更新为审核通过时间,状态应该更新为报名中;结果活动场次表数据没更新,状态也没有更新。
3.产生原因:
事务方法内更新了活动场次表,但是事务还没有结束,没有提交。此时消息已经发送出去,消费者查询到场次表活动开始时间未更新,判断为活动场次报名未开始。之后事务方法提交,再之后消费者提交更新把事务方法的更新覆盖掉了。由于消费者更新时把更新时间参数也带进去了,导致数据库更新时间也是一个脏数据。从数据库上看,完全看不出活动场次表的更新痕迹。大坑!
4.解决方法:
事务提交之后再发送异步消息

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值