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进行对应的回滚注解和其他操作,这里不做赘述。

你可能感兴趣的:(mysql,数据库)