在单库单系统中,不需要对事物进行特殊的处理,回滚即可。当一个大系统拆分多个子系统微服务之后,由于事物不支持跨系统处理,就有了分布式事物的问题。
解决分布式事物常见的方案有以下几种:
- 基于消息中间件解决,比较常用的方案,可靠性高,适合于对实时性要求不是很高的应用场景。
- TCC(try confirm cancel)事物补偿性方案,实时性高,个人理解为直接通过rpc交互,如发生异常或者业务不满足,直接通过rpc作数据还原请求,需要写好事物还原接口。
- 最大努力通知型方案,经典案例微信支付宝支付回调,需做好查重,保持幂等性。
幂等性
幂等性是对接口而言,接口的幂等性是指在多次调用的情况下,得到的结果都能保持一致,业务需求一致。查询接口天然幂等,赠删改都要借助其他来保证幂等性。
保证幂等性方案有两种,去重表和全局唯一id。
- 去重表:在支付场景中,每个订单只能成功支付一次,可以建一张去重表,保存支付成功的订单信息,并且保证订单id唯一,外部服务请求支付订单时,首先在去重表中查询是否存在该订单,存在则不执行,典型的例如对接微信支付、支付宝支付、银企直连。
- 全局唯一id:根据业务和内容生成对应的唯一id,存储起来,比如存储在redis,执行业务之前根据这个全局id判定是否已经处理过,唯一id可用业务记录的关键内容、时间戳、记录id、uuid等生成。