003 分布式事务实现 | TCC原理描述

考虑如下场景,用户新增订单,从账户减去相应的钱数,增加对应的用户积分,如此流程,订单,账户,积分,有三个不同的数据库构成,因此,如果实现分布式事务的效果,除了采用Atomikos之外,还可以采用TCC的方式,

TCC=Try Confirm Cancel

Try,尝试着去做,尝试生成一个订单,尝试从用户账号中减去钱数,尝试给用户增加一定的积分,
Confirm,确定,将尝试的结果,变成最终结果,
Cancel,删除尝试的内容,

订单系统的TCC

  • Try,可以生成一个新订单,给予paying的状态,即,通过状态来标记订单正处于支付过程。
  • Confirm,订单状态更改,paying->payed
  • Cancel,删除该订单,或者订单状态更改为 new,回归到订单最终新建状态,对于new状态,后续可以重新支付,除非用户cancel掉订单,将其改成canceled即可。

账号系统的TCC,假定以后账户数据,id=1,amount=100,订单费用10

  • Try,直接从amount上减去10?,no,直接减去,没办法cancel了,增加pre_amount字段,给予-10的值,这样用户总账号为amount+pre_amount=90元
  • Confirm,update amount=amount+pre_amount, pre_amount=0 where id=1
  • Cancel,直接update pre_amount=0 where id=1 即可。

积分系统的TCC,同账号系统TCC实现方式。

总结,TCC的方式,就是通过业务逻辑的方式,借助额外的状态,或者字段等等,完成操作的预先执行,等到没有问题后确认生效,如果出现问题,则将预先执行的数据删除掉。

国内很多开源的系统支持TCC分布式框架,比如ByteTCCtcc-transactionhimly,可以和spring cloud,dubbo等结合使用,实现TCC效果

阿里的Fescar也开源了,可以实现TCC

你可能感兴趣的:(003 分布式事务实现 | TCC原理描述)