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;
相关推荐
我命由我1234510 分钟前
PHP - PHP 基本随机数生成函数
开发语言·ide·后端·java-ee·php·intellij-idea·intellij idea
楼田莉子17 分钟前
C#学习之C#入门学习
开发语言·后端·学习·c#
海上彼尚20 分钟前
Nodejs也能写Agent - 6.基础篇 - Agent
前端·人工智能·后端·node.js
旺仔Sec27 分钟前
HBase 分布式集群部署实战:从解压到启动的完整指南
数据库·分布式·hbase
字节高级特工32 分钟前
C++11(一) 革新:右值引用与移动语义
java·开发语言·c++·人工智能·后端
青云计划37 分钟前
Synchronized 锁升级:从偏向锁到重量级锁的性能进化之路
java·后端
candyTong11 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
GetcharZp12 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端
zhangxingchao13 小时前
多 Agent 架构到底怎么选?从 Claude Agent Teams、Cognition/Devin 到工程落地原则
前端·人工智能·后端
IT_陈寒14 小时前
SpringBoot那个自动配置的坑,害我排查到凌晨三点
前端·人工智能·后端