业务逻辑导致事务执行时间长产生脏读脏数据问题

订单处理步骤:

1. 订单平台在支付完成后,会通过消息系统通知业态处理订单

2. 业态处理完成订单后,如果此时已经到了订单完成的步骤则会通过消息系统通知订单平台订单完成

3. 订单平台处理订单完成后续逻辑

业务场景:

1. 保洁订单属于后定价订单,在支付完成后订单状态就已经完成

2. 订单平台在处理支付的时候发消息给保洁业态,告诉业态订单支付完成,但此时订单平台数据库事务还没提交

3. 保洁业态接到订单支付完成消息,处理订单支付完成后续逻辑,此时订单已没有后续处理逻辑,保洁通知订单平台订单已完成

4. 订单平台接到订单完成消息, 处理订单完成后续逻辑, 包括修改订单状态, 流水状态等, 但此时可能有一个问题,  订单平台处理支付完成的数据库事务还没有提交, 导致此时查询的数据还是支付完成之前的数据, 再处理时已经是脏数据

问题原因: 在支付完成事务还未提交时,发送消息通知业态支付完成,业态处理完后又发送消息通知订单平台订单已完成,此时如果消息通知很快,但数据库处理比较慢,就会导致支付完成事务还未提交,订单完成的事务就开始处理订单,这时候第二个事务(处理订单完成的事务)读取到的数据就是脏数据,此时支付完成事务已经提交,订单完成事务再提交,数据库中的数据就是脏数据

解决办法:

1. 集中式状态处理,  将订单的处理状态放到radis中, 此时下一个事务开始前先去radis中查看是否订单的状态是可处理, 若是则查询处理,  若否则等待, 此方法可能会导致等待时间过长

2. 将消息通知放到方法的最后, 也就是处理完支付完成逻辑后再处理, 但此时消息通知还是在事务里边, 不能从根本解决问题

3. 最终解决办法: 将支付完成逻辑处理和消息通知拆开, 事务只包含支付完成逻辑, 等事务提交后再发送消息通知到业态(将方法拆成两个方法)

转载于:https://www.cnblogs.com/stefanking/articles/5134468.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值