mysql事物回滚异常问题(java后台)

1、现象:用户积分抽奖时,抽奖失败,但是积分还是扣了。

2、流程:抽奖IMP为:用户A减去积分 -> A积分余额更新至数据库->A信息更新至redis-> 抽奖获得物品-> 存储A背包.(而后通过API接口返回给app最新的用户信息,app端发现积分被消耗,但抽奖无记录)

3、整个流程都被事物@Transcational注解包裹,正常来说,要么抽奖失败,就整个事物回退,包括用户余额也会回退到抽奖之前的余额;要么就整个事物执行成功;应该是不会出现用户抽奖失败,而积分依然被扣除,没有回退到抽奖之前的情况。

原因:就在2、流程的第三步更新至redis,因为没有redis对应的事物机制,导致2、流程其他关于数据库的操作都回退了,包括数据库里边的用户积分也回退到抽奖之前;但是redis未回退,导致整个2、流程发生异常后,redis存储的用户积分,是“抽完奖“以后的积分,然后又把redis存储的用户信息返回给app,就造成3、的现象

解决方式:要么简单的对”mysql和redis“进行解耦,把整个事物中,关于mysql操作的代码,全都放在redis之前,这样可以保证,mysql发生异常回滚时,redis还未更新,也就自然不可能跟msyql数据不一致了;第二种就是自己百度,对redis进行对应的回滚注解和其他操作,这里不做赘述。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值