5、Seata

分布式事务 产生原因:

  • 由于 service 相互分离,没有协同,相互感知各自的状态,导致事务回滚出现问题

原理

  • RM(Resource Manager):用于直接执行本地事务的提交和回滚。
  • TM(Transaction Manager):TM是分布式事务的核心管理者。比如现在我们需要在借阅服务中开启全局事务,来让其自身、图书服务、用户服务都参与进来,也就是说一般全局事务发起者就是TM。
  • TC(Transaction Manager)这个就是我们的Seata服务器,用于全局控制,比如在XA模式下就是一个协调者的角色,而一个分布式事务的启动就是由TM向TC发起请求,TC再来与其他的RM进行协调操作。

TM请求TC开启一个全局事务,TC会生成一个XID作为该全局事务的编号,XID会在微服务的调用链路中传播,保证将多个微服务的子事务关联在一起;RM请求TC将本地事务注册为全局事务的分支事务,通过全局事务的XID进行关联;TM请求TC告诉XID对应的全局事务是进行提交还是回滚;TC驱动RM将XID对应的自己的本地事务进行提交还是回滚;


一、安裝

各个服务作为Seate的客户端,只需要导入依赖即可:

xml 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

然后添加配置:

yml 复制代码
seata:
  service:
    vgroup-mapping:
    	# 这里需要对事务组做映射,默认的分组名为 应用名称-seata-service-group,将其映射到default集群
    	# 这个很关键,一定要配置对,不然会找不到服务
      bookservice-seata-service-group: default
    grouplist:
      default: localhost:8868

二、使用

开启分布式事务的方法上添加@GlobalTransactional注解:

java 复制代码
@GlobalTransactional 
@Override 
public boolean doBorrow(int uid, int bid) 

Seata会分析修改数据的sql,同时生成对应的反向回滚SQL,这个回滚记录会存放在undo_log 表中。所以要求每一个Client 都有一个对应的undo_log表(也就是说每个服务连接的数据库都需要创建这样一个表,这里由于我们三个服务都用的同一个数据库,所以说就只用在这个数据库中创建undo_log表即可),表SQL定义如下:

sql 复制代码
CREATE TABLE `undo_log`
(
  `id`            BIGINT(20)   NOT NULL AUTO_INCREMENT,
  `branch_id`     BIGINT(20)   NOT NULL,
  `xid`           VARCHAR(100) NOT NULL,
  `context`       VARCHAR(128) NOT NULL,
  `rollback_info` LONGBLOB     NOT NULL,
  `log_status`    INT(11)      NOT NULL,
  `log_created`   DATETIME     NOT NULL,
  `log_modified`  DATETIME     NOT NULL,
  `ext`           VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8;
相关推荐
Qiuner3 分钟前
Spring Boot 全局异常处理策略设计(三):@ExceptionHandler 与 @ControllerAdvice 生效原理源码解析
java·spring boot·后端
Java天梯之路11 分钟前
Spring Boot 钩子全集实战(五):ApplicationContextInitializer详解
java·spring boot·后端
BingoGo13 分钟前
PHP 8.5 #[\NoDiscard] 揪出"忽略返回值"的 Bug
后端·php
qq_12498707531 小时前
基于SpringCloud的分布式演唱会抢票系统(源码+论文+部署+安装)
分布式·spring·spring cloud·毕业设计·计算机毕业设计
vx-bot5556661 小时前
1024proxy现代对抗性环境下的分布式流量调度系统架构设计
分布式·系统架构
武藤一雄11 小时前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
程序新视界12 小时前
为什么不建议基于Multi-Agent来构建Agent工程?
人工智能·后端·agent
Victor35612 小时前
Hibernate(29)什么是Hibernate的连接池?
后端
Victor35612 小时前
Hibernate(30)Hibernate的Named Query是什么?
后端
源代码•宸12 小时前
GoLang八股(Go语言基础)
开发语言·后端·golang·map·defer·recover·panic