目录
- 1. TCC是什么
- 2. TCC流程
- 3. 2PC vs TCC
- 4. TCC的问题
- 5. TCC的使用场景
- 6. TCC的实现
- 6.1. Seata的TCC模式
- 6.2. Seata的AT模式
- 7. 参考
1. TCC是什么
保证最终一致性的一种分布式事务方案
2. TCC流程
- TCC:Try、 Confirm、 Cancel
- 把事务分成两个阶段
- 第一阶段执行Try操作,对业务检查及资源预留
- 第二阶段根据第一阶段的结果决定。
- 如果第一阶段成功则执行Confirm 做业务确认操作;
- 如果第一阶段失败则执行Cancel(实现一个与 Try 相反的操作,类似于人工回滚)
3. 2PC vs TCC
- 跟2PC比较非常相似,都是两个阶段
- 2PC是数据库层面的两阶段,而TCC是应用层面的两阶段
- TCC的每个Try、Confirm、Cancel各自在一个单独的事务中;而2PC则是在一个事务中
- TCC解决了2PC几个缺点
- 性能问题:阶段1只是检查并预留资源,不需要加锁至阶段2
- 单点问题:阶段1完成之后,在阶段2如果业务活动管理器挂了那么还有其他的业务活动管理器
- 一致性问题:阶段1完成之后,在阶段2如果任一参与者挂了没有返回ACK,那么一直重试直至成功(因为阶段1已经预留了资源可以保证成功)
4. TCC的问题
- 侵入性高:依赖于业务方来配合提供ry, confirm, cancel 三个接口
5. TCC的使用场景
- 适用于强一致性、实时性要求高、分布式事务可以回滚的业务的处理结果,比如互联网金融企业最核心的三个服务:交易、支付、账务
- 多个服务使用多个数据源且数据源可以不是DB
6. TCC的实现
6.1. Seata的TCC模式
- 不依赖于底层数据资源的事务支持:
- 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
- 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
- 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
6.2. Seata的AT模式
- 基于 支持本地 ACID 事务 的 关系型数据库
- Java 应用,通过 JDBC 访问数据库。
- Seata的AT模式第二阶段根本不需要我们编写,全部有Seata自己实现了
7. 参考
- 再有人问你分布式事务,把这篇扔给他 - 掘金
- 事务 - 请问TCC和2PC的区别在哪里 - SegmentFault 思否
- 请问TCC和2PC的区别在哪里? - 知乎
- Seata Tcc 模式
- Seata AT 模式
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除 |