分布式事务之说说TCC事务
Try:尝试执行业务。完成所有业务检查(一致性):检查A、B、C的帐户状态是否正常,帐户A的余额是否不少于30元,帐户B的余额是否不少于50元。预留必须业务资源(准隔离性):帐户A的冻结金额增加30元,帐户B的冻结金额增加50元,这样就保证不会出现其他并发进程扣减了这两个帐户的余额而导致在后续的真正转帐操作过程中,帐户A和B的可用余额不够的情况。:确认执行业务。真正执行业务:如果Try阶段帐户A、B、C状态正常,且帐户A、B余额够用,则执行帐户A给账户C转账30元、帐户B给账户C转账50元的转帐操作。不做任何业务检查:这时已经不需要做业务检查,Try阶段已经完成了业务检查。只使用Try阶段预留的业务资源:只需要使用Try阶段帐户A和帐户B冻结的金额即可。:取消执行业务释放Try阶段预留的业务资源:如果Try阶段部分成功,比如帐户A的余额够用,且冻结相应金额成功,帐户B的余额不够而冻结失败,则需要对帐户A做操作,将帐户A被冻结的金额解冻掉。 小结:到底要不要使用TCC 到底要不要使用TCC事务,取决于以下几点:是否真正有保证跨应用业务操作的原子性需求。研发上能否投入资源开发相对应的TCC接口。
当然还有最后一点,能否搞定一个稳定的、高可用的、扩展性强的TCC事务管理器。
一个问题,如果TCC事务在Try阶段所有参与方(从业务服务)成功了,但是阶段部分参与方(从业务服务)成功,如何处理?
TCC参考资料《大规模SOA系统中的分布式事务处理》:蚂蚁金服CTO程立早年的一篇关于分布式事务的PPT,里面有关于大规模SOA系统中包括TCC在内的各种分布式事务处理方案,是支付宝在分布式事务实践的经验精华。《 : a 》:公司的Guy 和另一位作者一同写的一篇关于TCC事务设计方案的论文,对TCC的实现细节描述较为清楚。 原创文章转载请注明作者信息和原始出处”数据架构”。
关于作者
张磊,京东金融资深数据架构师