分布式事务解决框架seata介绍

简介: 分布式事务解决框架seata介绍

公众号merlinsea


  • seata框架的核心
  • 抽取出了一个TC全局事务协调器,所有的分支事务都要向其汇报
  • 当在客户端开启一个分布式事务时,TC会为这个分布式事务生成一个唯一的XID,并在后续的其他事务中传递
  • 所有的分支事务都执行完阶段一预提交时要等待TC发出的commit或者rollback命令以后才能继续往下执行。


  • seata的架构和核心组成
  • TC :Transaction coordinator 全局事务协调器,TC是位于seata的中心服务端,用于统一管理各个微服务节点上的事务状态, 并根据这些分布式事务的状态决定是否提交commit还是回滚rollback。
  • TM:Transaction manager 事务管理器,用于开启,提交,回滚事务。TM是位于业务端端代码,当开启一个分布式事务时,会生成 一个用于唯一标识这个分布式事务XID,并且这个XID会在后续调用其他微服务中传递。
  • RM:Resource manager 资源管理器,用于各个微服务上的数据库资源的管理,并且可以向TC注册分支事务,接受TC传来的提交或者回滚 命令


  • 注释
  • 注1: seata架构的RM是以jar包的形式嵌入到业务代码中
  • 注2: TM 请求 TC 开启一个全局事务, TC 会生成一个 XID 作为该全局事务的编号XID, XID会在微服务的调用链路中传播,保证将多个微 服务的子事务关联在一起。
  • 架构:TC 为单独部署的 Server 服务端,TM 和 RM 为嵌入到应用中的 Client 客户端 (Client/Server架构)


  • seata执行分布式事务的流程(如下图所示)
  • A服务的TM 向 TC 申请开启(Begin)一个全局事务,全局事务创建成功并生成一个全局唯一的 XID。
  • A服务的RM向TC注册分支事务
  • A服务执行分支事务(这里是本地事务),对数据库做操作
  • A服务开始远程调用B服务,并把XID 在微服务调用链路的上下文中传播【保证了 B服务可以为一识别这个事务】
  • B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖
  • B服务执行分支事务,向数据库做操作
  • 全局事务调用链处理完毕,TM 根据有无异常向 TC 发起针对 XID 的全局提交(Commit)或回滚(Rollback)决议。 TC 调度 XID 下管辖的全部分支事务完成提交(Commit)或回滚(Rollback)请求。


640.jpg


  • seata执行模式介绍(AT模式)
  • 第一阶段: seata 会拦截“业务 SQL”,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”【回滚的时候使用】, 然后执行“业务 SQL”更新业务数据 在业务数据更新之后,再将其保存成“after image”【提交的时候使用】,最后生成行锁 以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性
  • 第二阶段:
  • 二阶段提交: 因为“业务 SQL”在一阶段已经提交至数据库, 所以 Seata 框架只需将阶段一保存的快照数据和行锁删掉,完成数据清理即可。
  • 二阶段回滚: 还原业务数据, 回滚方式便是用“before image”还原业务数据。


  • seata框架的使用
  • 开启seata服务端程序(TC全局事务协调器)


去seata官网下载并部署到linux服务器上,然后用下面的命令启动seata
./seata-server.sh启动
  • 在所有涉及分布式事务的微服务中中引入seata客户端赖
  • 注意:需要保证seata客户端的版本和seata服务端端版本一致,否则可能出现maven包冲突(难排查)
<!--alibaba微服务整合分布式事务,这个方式才行-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.seata</groupId>
                    <artifactId>seata-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>


  • 编写业务,开启分布式全局事务TM事务管理器 @GlobalTransactional
  • 注意事务管理器只需要添加在开启事务的哪个接口api上即可,后续被调用的微服务接口上不需要再添加这个注解,在本案例中是加在user微服务的注册接口上
 @Override
//全局事务管理器TM
 @GlobalTransactional
 public JsonData register(UserRegisterRequest registerRequest) {
     boolean checkCode = false;
     //校验验证码
     if (StringUtils.isNotBlank(registerRequest.getMail())) {
         checkCode = notifyService.checkCode(SendCodeEnum.USER_REGISTER, registerRequest.getMail(), registerRequest.getCode());
     }
     if (!checkCode) {
         return JsonData.buildResult(BizCodeEnum.CODE_ERROR);
     }
     UserDO userDO = new UserDO();
     BeanUtils.copyProperties(registerRequest, userDO);
     userDO.setCreateTime(new Date());
     userDO.setSlogan("人生需要动态规划,学习需要贪心算法");
     //设置密码 生成秘钥 盐
     userDO.setSecret("$1$" + CommonUtil.getStringNumRandom(8));
     //密码+盐处理
     String cryptPwd = Md5Crypt.md5Crypt(registerRequest.getPwd().getBytes(), userDO.getSecret());
     userDO.setPwd(cryptPwd);
     //账号唯一性检查 
     if (checkUnique(userDO.getMail())) {
         int rows = userMapper.insert(userDO);
         log.info("rows:{},注册成功:{}", rows, userDO.toString());
         //新用户注册成功,初始化信息,发放福利等 TODO
         userRegisterInitTask(userDO);
         //模拟异常
         //int b = 1/0;
         return JsonData.buildSuccess();
     } else {
         return JsonData.buildResult(BizCodeEnum.ACCOUNT_REPEAT);
     }
 }


相关文章
|
2天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
16 2
|
13天前
|
消息中间件 SQL 中间件
大厂都在用的分布式事务方案,Seata+RocketMQ带你打破10万QPS瓶颈
分布式事务涉及跨多个数据库或服务的操作,确保数据一致性。本地事务通过数据库直接支持ACID特性,而分布式事务则需解决跨服务协调难、高并发压力及性能与一致性权衡等问题。常见的解决方案包括两阶段提交(2PC)、Seata提供的AT和TCC模式、以及基于消息队列的最终一致性方案。这些方法各有优劣,适用于不同业务场景,选择合适的方案需综合考虑业务需求、系统规模和技术团队能力。
101 7
|
25天前
|
消息中间件 数据库
Seata框架的工作原理
你还可以进一步深入研究 Seata 框架的技术细节和具体实现,以更好地理解其工作原理和优势。同时,结合实际应用场景进行实践和优化,也是提高分布式事务处理能力的重要途径。
39 15
|
25天前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
45 6
|
23天前
Seata框架在AT模式下是如何保证数据一致性的?
通过以上这些机制的协同作用,Seata 在 AT 模式下能够有效地保证数据的一致性,确保分布式事务的可靠执行。你还可以进一步深入研究 Seata 的具体实现细节,以更好地理解其数据一致性保障的原理。
37 3
|
23天前
|
测试技术
Seata框架的性能如何?
总的来说,Seata 框架在性能方面具有一定的潜力和优势,但需要根据具体情况进行综合评估和优化,以确保其在实际应用中能够发挥出良好的性能表现。
30 1
|
23天前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
23 1
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
18天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
47 5
|
21天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
39 8
下一篇
DataWorks