我们的余额表放在余额数据库里,订单表放在订单数据库里,交易流水表放在交易流水系统里。所有服务是通过dubbo这个中间件来进行调用的。
现在有个问题就是:
用户支付宝支付了充值订单后,支付回调我们的后台系统,后台会修改订单支付状态为已支付,然后从余额 表里增加余额,但是就是在增加余额的时候成功了,当接下来调用交易流水服务的时候,后台在那一瞬间宕机了。
因为是都是不同的库,事务属于分布式事务,造成余额表修改成功了,但是交易流水表记录流水数据失败了。然后支付宝又再次回调我们后台,导致余额表又修改了一次余额。
现在我的解决办法是加多一张余额费用记录表到余额数据库里头,主要字段就是orderNo(订单号),fee(增加费用) ,如果某订单支付成功了,这个表就会增加一条数据,把余额增加和余额费用记录表做成同一个事务,支付宝每次回调都会先查余额费用记表录里有没有数据
1)没数据就先修改余额,然后插入余额费用记录表
2)有数据,就直接跳过余额加款这个操作
这样目前暂时就是没造成余额修改成功,交易流水表扣款失败,导致支付宝重复回调,重复扣款的问题了。
但是这样我觉得还是不大妥,不知还有什么方案好使。
https://blog.csdn.net/w501631338/article/details/55191961
我还是没搞明白你说的不同的库和不同的事务是指什么?余额表和流水表不是一个库?在处理余额表事物的方法里调用另外service里的流水表事务吗?
可以把这种瞬间宕机时的操作记录到RDS,然后后台写一个服务,定时去检查这个RDS有没有存储操作记录,有的话,就按照存储的数据进行一次,成功了就删除,不成功就等到下一个轮询去处理,直到处理成功。
不支持部分付款,只支持全部付款,余额字段只能更新一次,默认值为0
你这个每个数据表在单独的数据库里面不就相当于垂直分库两阶段事务,直接使用sharding-jdbc不再调用本地事务,而是使用XA两阶段事务,要么一起成功,要么一起失败,数据回滚。