SpringCloud Alibaba-Seata

Seata概念

既然分布式事务处理起来这么麻烦,那能不能让分布式事务处理起来像本地事务那么简单。当然这是我们的愿景。当然这个愿景是所有开发人员所希望的。而阿里巴巴团队就为这个愿景做出了行动,发起了开源项目 Seata(Simple Extensible Autonomous Transaction Architecture) 。这是一套分布式事务解决方案,意在解决开发人员遇到的分布式事务各方面的难题。

Seata 的设计目标是对业务无侵入,因此它是从业务无侵入的两阶段提交(全局事务)着手,在传统的两阶段上进行改进,他把一个分布式事务理解成一个包含了若干分支事务的全局事务。而全局事务的职责是协调它管理的分支事务达成一致性,要么一起成功提交,要么一起失败回滚。也就是一荣俱荣一损俱损~

Seata 组成

我们看下 Seata 中存在几种重要角色:

  • TC(Transaction Coordinator):事务协调者。管理全局的分支事务的状态,用于全局性事务的提交和回滚。

  • TM(Transaction Manager):事务管理者。用于开启、提交或回滚事务。

  • RM(Resource Manager):资源管理器。用于分支事务上的资源管理,向 TC 注册分支事务,上报分支事务的状态,接收 TC 的命令来提交或者回滚分支事务。

这是一种很巧妙的设计,我们来看图:

执行流程是这样的:

  1. 服务A中的 TMTC 申请开启一个全局事务,TC 就会创建一个全局事务并返回一个唯一的 XID

  1. 服务A中的 RMTC 注册分支事务,然后将这个分支事务纳入 XID 对应的全局事务管辖中

  1. 服务A开始执行分支事务

  1. 服务A开始远程调用B服务,此时 XID 会根据调用链传播

  1. 服务B中的 RM 也向 TC 注册分支事务,然后将这个分支事务纳入 XID 对应的全局事务管辖中

  1. 服务B开始执行分支事务

  1. 全局事务调用处理结束后,TM 会根据有误异常情况,向 TC 发起全局事务的提交或回滚

  1. TC 协调其管辖之下的所有分支事务,决定是提交还是回滚

工作模式

Seata 支持四种工作模式: 1. AT(Auto Transaction)

AT模式是Seata默认的工作模式。需要基于支持本地 ACID 事务的关系型数据库,Java 应用,通过 JDBC 访问数据库。

2.整体机制

该模式是XA协议的演变,XA协议是基于资源管理器实现,而AT并不是如此。AT的2个阶段分别是:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

  • 二阶段:提交异步化,非常快速地完成;回滚通过一阶段的回滚日志进行反向补偿。

下图中,步骤1开启全局事务;步骤2注册分支事务,这里对应着一阶段;步骤3提交或者回滚分支事务,对应着二阶段。

3.特点

  • 优点:对代码无侵入;并发度高,本地锁在一阶段就会释放;不需要数据库对XA协议的支持。

  • 缺点:只能用在支持ACID的关系型数据库;SQL解析还不能支持全部语法。

Seata使用

  1. 添加依赖

  1. 创建一个数据库seata-storage,其中新建两个表:

storage:库存的业务表,SQL如下:

CREATE TABLE `storage` (

`id` bigint(11) NOT NULL AUTO_INCREMENT,

`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,

`num` bigint(11) NULL DEFAULT NULL COMMENT '数量',

`create_time` datetime(0) NULL DEFAULT NULL,

`price` bigint(10) NULL DEFAULT NULL COMMENT '单价,单位分',

PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Compact;

undo_log:回滚日志表,这是Seata要求必须有的,每个业务库都应该创建一个,SQL如下:

CREATE TABLE `undo_log` (

`branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',

`xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'global transaction id',

`context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 'undo_log context,such as serialization',

`rollback_info` longblob NOT NULL COMMENT 'rollback info',

`log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',

`log_created` datetime(6) NOT NULL COMMENT 'create datetime',

`log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',

UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = 'AT transaction mode undo table' ROW_FORMAT = Compact;

seata相关配置

详细配置如下:

spring:

application:

## 指定服务名称,在nacos中的名字

name: seata-storage

## 客户端seata的相关配置

seata:

## 是否开启seata,默认true

enabled: true

application-id: ${spring.application.name}

## seata事务组的名称,一定要和config.tx(nacos)中配置的相同

tx-service-group: ${spring.application.name}-tx-group

## 配置中心的配置

config:

## 使用类型nacos

type: nacos

## nacos作为配置中心的相关配置,需要和server在同一个注册中心下

nacos:

## 命名空间,需要server端(registry和config)、nacos配置client端(registry和config)保持一致

namespace: 7a7581ef-433d-46f3-93f9-5fdc18239c65

## 地址

server-addr: localhost:8848

## 组, 需要server端(registry和config)、nacos配置client端(registry和config)保持一致

group: SEATA_GROUP

## 用户名和密码

username: nacos

password: nacos

registry:

type: nacos

nacos:

## 这里的名字一定要和seata服务端中的名称相同,默认是seata-server

application: seata-server

## 需要server端(registry和config)、nacos配置client端(registry和config)保持一致

group: SEATA_GROUP

namespace: 7a7581ef-433d-46f3-93f9-5fdc18239c65

username: nacos

password: nacos

server-addr: localhost:8848

以上配置注释已经很清楚,这里着重强调以下几点:

  • 客户端seata中的nacos相关配置要和服务端相同,比如地址、命名空间...

  • tx-service-group:这个属性一定要注意,这个一定要和服务端的配置一致,否则不生效;比如上述配置中的,就要在nacos中新增一个配置service.vgroupMapping.seata-storage-tx-group=default,如下图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code.song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值