java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot集成Seata

SpringBoot集成Seata的全过程

作者:高高要努力

本文介绍了事务的四大特性(原子性、一致性、隔离性、持久性)以及本地事务和分布式事务的概念,本地事务是指在单个数据库级别的事务管理,而分布式事务则是跨多个数据库或服务的事务管理,感兴趣的朋友一起看看吧

1.本地事务和分布式事务概念

事务四大特性

本地事务:所有的事务都是基于数据库的,那么我们在代码中加@Transactional其实是使用的数据库的Begin/Commit/Rollback,底层使用的是动态代理。本地事务只能管理到当前服务连接的那个数据库的事务,如果一个事务中操作了多个数据库在回顾的时候只能回滚当前服务连接的那个数据库,没办法回滚其它数据库

分布式事务:用于解决在一个方法中操作多个数据库的事务,分布式事务其实就是将多个数据库加入到同一组事务中,当某一个数据库发生异常时整体回滚

2.分布式事务的解决方案

2.1 XA协议

2.2 2PC模式

2PC就是基于XA协议进行实现的,采用两阶段提交 2PC(Two Phase Commitment Protocol)来管理分布式事务,所谓二阶段是有两个阶段组成,一阶段投票阶段和二阶段提交阶段。同时它是由“事务协调器”和若干“事务执行者”两个角色组成。

第一阶段:准备阶段( 投票阶段 )

第二阶段:提交阶段

正常流程

回滚流程

发送回滚指令

二阶段提交的问题

2.3 3PC模式

三阶段提交(Three-phase commit),也叫三阶段提交协议(Three-phase commit protocol),是二阶段提交(2PC)的改进版本,

3PC在2PC的功能上做了两个改动,一是在协调者和事务参与者之间引入了超时机制,在第一阶段和第二阶段中插入一个准备阶段 , 保证了在最后提交阶段之前各参与节点的状态是一致的,那么现在的三阶段分为了:

第一阶段“canCommit” :

第二阶段“papreCommit”

事务协调者收到所有的事务参与者的canCmmit指令的反馈结果,这里有两种情况,一是所有的反馈都是yes,二是有部分的事 务参与者返回No,后者反馈超时。

正常流程

中断事务

第三阶段“doCommit阶段”

这里准备提交事务了,这里有两种情况,如果事务协调者收到所有的事务参与者的papreCommit指令反馈结果都是ACK,那么进入doCommit阶段,否则会中断事务。

正常流程

中断事务

2.4 TCC事物补偿

TCC(Try Confirm Cancel) 事务补偿机制,即每一个操作都要做相应的补偿机制,即如何确认操作成功,如果操作失败如何撤销事务。它分为三个阶段

2.5 MQ消息最终一致性

大致流程是:

1.主业务方向发送一个“Prepared”准备消息到MQ,这个消息还未被确认,不会发生给消费者,然后MQ向生产者发送确认收到消息,然后主业务方执行自己的业务,并提交本地事务,成功后向MQ确认之前的“Prepared”消息发生给消费者,如果失败MQ将当前半消息删除,取消事务。

2.消息接受者方收到消息后执行业务逻辑,提交本地事务,然后向MQ返回ACK确认消息,如果ACK消息为成功,MQ则删除当前消息;如果消费者消息接受失败或返回ACK是失败,会进行重试,保证消息最终被消费。直到16次后还是失败,消息会进入死信队列,该消息不会被删除,也不会重发,需要人工介入;

RocketMQ的事务消息:使用MQ的分布式事务是最终一致性

2.6 Seata框架

seata(Simple Extensible Autonomous Transaction Architecture) 是 阿里巴巴开源的分布式事务中间件,致力于提供高性能,零入侵和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

Seata 的设计思路是将一个分布式事务可以理解成一个全局事务,下面挂了若干个分支事务,而一个分支事务是一个满足 ACID 的本地事务,因此我们可以操作分布式事务像操作本地事务一样。

Seata重要组成

正常执行流程:

异常执行流程:

前面2个步骤都跟上面一样,这里省略 , 在第 3 步的时候,Order在可能因为某种原因本地分支事务提交失败了,那么RM会向TC上报一个失败的事务状态

在第 4 步 ,这个时候代码回到Business,这时TM事务管理器会向TC事务协调者发起全局事务回滚请求,TC向RM事务分支发起事务回滚请求,RM(Order, Account)收到回滚指令,然后会解析undo log,指向反向操作,把数据还原到修改之前,删除undo log,提交本地事务。

3.微服务整合seata

3.1导入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

3.2yaml配置seata

项目的yaml中对seata做配置

这里的tx-service-group: ${spring.application.name}-tx-group要和seataServer.properties中的保持一致

seata:
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: ${spring.application.name}-tx-group #it-fccar-service-driver-tx-group
  #对应seataServer.properties中的service.vgroupMapping.it-drive-service-driver-tx-group=default
  config:
    type: nacos
    nacos:
      server-addr: ${NACOS_HOST:8.137.85.173:8848}:${NACOS_PORT:8848}
      username: nacos
      password: nacos #账号再nacos管理界面配置
      namespace: fccar-dev #取pom.xml中的命名空间
      data-id: seataServer.properties
      group: DEFAULT_GROUP #重要,和seataServer.properties保持一样
  registry:
    type: nacos
    nacos:
      application: service-seata #seata的服务名
      server-addr: ${NACOS_HOST:8.137.85.173:8848}:${NACOS_PORT:8848}
      username: nacos
      password: nacos #账号再nacos管理界面配置
      namespace: fccar-dev #取pom.xml中的命名空间
      group: DEFAULT_GROUP
  enable-auto-data-source-proxy: true #开启seata的datasource自动代理

在启动类贴注解开启seata , 因为yaml做了配置,下面注解可以不要

@EnableAutoDataSourceProxy(dataSourceProxyMode="AT",useJdkProxy=false)

3.3.开启全局事务

开启全局事务,在入口方法贴注解

注意:只在业务入口的微服务的方法上贴即可

@GlobalTransactional(name = "driver-wechat-register",rollbackFor = Exception.class)

到此这篇关于SpringBoot集成Seata的文章就介绍到这了,更多相关SpringBoot集成Seata内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文