终于有人把“分布式事务”说清楚了( 五 )


 

终于有人把“分布式事务”说清楚了

文章插图
 
 
执行流程:
  • 业务系统调用支付平台支付接口,并在本地进行记录,支付状态为支付中 。
  • 支付平台进行支付操作之后,无论成功还是失败,都需要给业务系统一个结果通知 。
  • 如果通知一直失败则根据重试规则进行重试,达到最大通知次数后,不再通知 。
  • 支付平台提供查询订单支付操作结果接口 。
  • 业务系统根据一定业务规则去支付平台查询支付结果 。
这种方案也是实现了最终一致性 。
④补偿事务 TCC
TCC,Try-Confirm-Cancel 的简称,针对每个操作,都需要有一个其对应的确认和取消操作 。
当操作成功时调用确认操作,当操作失败时调用取消操作,类似于二阶段提交,只不过是这里的提交和回滚是针对业务上的,所以基于 TCC 实现的分布式事务也可以看做是对业务的一种补偿机制 。
TCC 的三阶段:
  • Try 阶段:对业务系统做检测及资源预留 。
  • Confirm 阶段:对业务系统做确认提交,Try 阶段执行成功并开始执行 Confirm 阶段时,默认 Confirm 阶段是不会出错的 。即:只要 Try 成功,Confirm 一定成功 。
  • Cancel 阶段:在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放 。
在 Try 阶段,是对业务系统进行检查及资源预览,比如订单和存储操作,需要检查库存剩余数量是否够用,并进行预留,预留操作的话就是新建一个可用库存数量字段,Try 阶段操作是对这个可用库存数量进行操作 。
比如下一个订单减一个库存:
 
终于有人把“分布式事务”说清楚了

文章插图
 
 
执行流程:
  • Try 阶段:订单系统将当前订单状态设置为支付中,库存系统校验当前剩余库存数量是否大于 1,然后将可用库存数量设置为库存剩余数量 -1 。
  • 如果 Try 阶段执行成功,执行 Confirm 阶段,将订单状态修改为支付成功,库存剩余数量修改为可用库存数量 。
  • 如果 Try 阶段执行失败,执行 Cancel 阶段,将订单状态修改为支付失败,可用库存数量修改为库存剩余数量 。
基于 TCC 实现分布式事务,代码逻辑相对复杂一些,需要将原来的接口的逻辑拆分为:Try,Confirm,Cancel 三个接口的逻辑 。
基于 TCC 实现的分布式事务框架:
  • ByteTCC,github.com/liuyangming
  • tcc-transaction:github.com/changmingxi
读完之后应该对分布式事务有了一个大致的了解,在实际生产中我们要尽量避免使用分布式事务,能转化为本地事务就用本地事务,如果必须使用分布式事务,还需要从业务角度多思考使用哪种方案更适合,总之行动之前多思考 。

【终于有人把“分布式事务”说清楚了】


推荐阅读