Seata源码——TCC模式总结

2023-12-24 21:52
文章标签 源码 总结 模式 seata tcc

本文主要是介绍Seata源码——TCC模式总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是TCC

TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel)
在这里插入图片描述

TCC的步骤

1.Try:对业务资源的检查并预留
2.Confirm:对业务处理进行提交,即 commit 操作,只要 Try 成功,那么该步骤一定成功
3.Cancel:对业务处理进行取消,即回滚操作,该步骤回对 Try 预留的资源进行释放

TCC的优点

1.TCC的本质原理是把数据库的二阶段提交上升到微服务来实现,从而避免了数据库2阶段中锁冲突的长事务低性能风险。
2.TCC异步高性能,它采用了try先检查,然后异步实现confirm,真正提交的是在confirm方法中。
3.不需要依赖数据库

TCC的缺点

1.设计复杂 使用成本高
2.业务代码侵入大

TCC和AT模式的区别

1、AT需要支持本地 ACID 事务的关系型数据库,TCC不依赖底层数据资源对事务的支持。
2、AT模式使用了全局锁和本地锁,能保证强一致性。TCC只能保证最终一致性。
3、AT模式由于大量使用了锁,吞吐量较低。
4、实现复杂度上,AT模式只需要简单的添加全局事务注解,基本可以实现零侵入,而TCC模式需要自己实现prepare、commit、rollback方法,并考虑空回滚、幂等、悬挂等问题,实现成本较高。

Seata如何实现TCC的

启动阶段

项目启动的时候会设置一个拦截器 专门拦截TCC请求进行处理

Try阶段

当TCC业务执行的时候 会被拦截器拦截
1.创建BusinessContext
2.设置BusinessContext的参数将BusinessContext加入上下文
3.将TwoPhaseBusinessAction注解的参数封装成BranchRegisterRequest请求发给TC注册分支事务
4.TC收到请求进行注册 并且全局事务ID返回给RM 此时这里和AT不同不用加全局锁
5.RM执行try的逻辑

Confirm

1.TM提交全局事务给TC
2.TC收到请求之后执行如下操作:
2.1如果全局事务中存在AT分支事务,先删除AT全局锁;
2.2同步提交TCC分支事务,发送BranchCommitRequest给RM,如果RM响应失败,异步重试至成功为止,如果 成功,删除分支事务;
2.3异步提交AT分支事务,发送BranchCommitRequest给RM,RM异步删除undo_log;
3.RM收到TC发送过来的分支事务提交请求之后通过反射调用 commit方法

Cancel

1.TM回滚全局事务,请求TC
2.TC处理全局回滚
2.1更新global_table全局事务为Rollbacking,如果有AT分支,更新lock_table为Rollbacking
2.2如果有AT分支,释放全局锁lock_table
2.3发送BranchRollbackRequest给RM,如果失败,异步重试至成功为止
2.4如果成功,同步删除branch_table中的分支事务,db/redis模式异步删除global_table全局事务
3.RM收到TC发送过来的回滚请求之后通过反射调用Rollback方法

TCC三大问题

1.幂等:由于网络波动,TC未在超时时间内收到RM二阶段响应,重试导致RM收到多次二阶段rollback或commit请求;
2.资源悬挂:由于网络波动,RM在收到二阶段rollback请求之后,再收到try请求;
3.空回滚:RM由于各种原因未成功执行try,TM回滚全局事务,RM在没有执行try的情况下rollback;

Seata是如何解决TCC三大问题的

在LocalTCC模式下,可以选择开启useTCCFence=true,通过seata框架内置的tcc分支事务状态表解决TCC的三大问题:
1.幂等:RM在try阶段会插入一条STATUS_TRIED状态的分支事务状态记录。收到rollback和commit请求时,RM会通过select for update查询分支事务状态记录,如果状态为STATUS_TRIED才会执行二阶段方法。
2.空回滚:如果rollback和commit时,RM通过select for update查询分支事务状态记录为空,则代表发生空回滚,这里尝试插入一条STATUS_SUSPENDED状态的分支事务记录。如果发生唯一约束冲突,代表try方法被同时执行,返回TC失败,TC会重试;如果没发生唯一约束冲突,返回成功。
3.资源悬挂:由于处理空回滚的时候会插入STATUS_SUSPENDED状态的分支事务记录,RM当rollback后收到try,插入STATUS_TRIED状态记录会发生唯一约束冲突,RM返回TC失败,避免了资源悬挂

参考链接

https://seata.io/zh-cn/docs/dev/mode/tcc-mode

这篇关于Seata源码——TCC模式总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/533271

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li