分布式事务
一丶文档
大佬们已经做了很好的总结, 我就不班门弄斧了,否则就有复制粘贴之嫌,嘿嘿
纸上得来终觉浅, 绝知此事要躬行. 看高大上的总结, 事后总会感觉模模糊糊的, 敲一下代码, 理解起来会更深刻一点.
正所谓tall is cheap, show me the code! 哈哈
目前使用了seata框架实现了AT, TCC, SAGA 3种模式
二丶简单总结
从使用方式来说, 分为同步和异步两种, 同步可以使用TCC, SAGA等方式,异步使用MQ进行.
1. 同步 (以Seata框架为例)
-
AT模式由Seata自动代理执行, 使用起来比较方便, 但性能不是特别好, 默认配合undo_log表使用
-
其中,TCC模式丶SAGA模式需要注意3个问题: 空回滚, 幂等性, 资源悬挂, 本demo通过添加额外的数据表解决
TCC模式使用t_[业务表]_transaction表, SAGA模式使用t_saga_transaction表
SAGA模式,还需要注意一个问题, 隔离性不好, 需要做到"宁可长款,不可短款", 即先对用户扣费, 补偿时,商家可以退款, 否则, 难以再次收费
Seata 的定位是分布式事全场景解决方案,未来还会有 XA 模式的分布式事务实现,每种模式都有它的适用场景, AT 模式是无侵入的分布式事务解决方案,适用于不希望对业务进行改造的场景,几乎0学习成本。 TCC 模式是高性能分布式事务解决方案,适用于核心系统等对性能有很高要求的场景。 Saga 模式是长事务解决方案,适用于业务流程长且需要保证事务最终一致性的业务系统, Saga 模式一阶段就会提交本地事务,无锁,长流程情况下可以保证性能, 多用于渠道层、集成层业务系统。事务参与者可能是其它公司的服务或者是遗留系统的服务,无法进行改造和提供 TCC 要求的接口,也可以使用 Saga 模式。
2. 异步
使用MQ, 这里又分两种.
一种是MQ支持分布式事务的,如RocketMQ,
另一种是MQ不支持分布式事务, 使用本地消息表进行处理