解决思路如下:
1.创建事务
2.先更新本地状态(失败则回滚)
3.再调用第三方接口
4.根据接口返回值决定事务提交还是回滚
这样首先保证了本地数据能够更新,再根据接口返回值判断是否更新。
这种方法只是针对单一操作,如果是大量的批量操作,建议使用队列进行异步处理。
问题一:
在事务中去请求第三方接口,容易导致事务时间过长,对方接口超时多久,你的数据库事务也会卡多久
问题二
如果我们是接口提供方还是接口调用方,都需要考虑程序异常,网络超时问题、服务器重启、并发等问题。
为了保证提供方数据一致性,我们需要接口提供方具有的特性:
- 回调
- 幂等性
- 回滚数据
- 提供结果查询
为了保证自身数据一致性,我们需要接口调用方的特性有:
- 幂等性
- 重新执行(有一个事务补偿机制,可以选择把失败的事务操作放到队列中,异步执行,重新执行失败的操作,如果一直都不成功那就说明,服务器有问题或者那段业务逻辑中的某个环节出现了问题)
- 或者要有记录数据变化的日志,如果出现异常,通过日志中的记录,把数据还原