SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata

事务简介

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有四个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括各种操作,要么都做,要么都不做。

一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态,事务的中间状态不能被观察到的。

隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发其他事务是隔离的,并发执行的各个事务之间不能互相干扰。隔离性又分为四个级别:读未提交(read uncommitted)、读已提交(read committed,解决脏读)、可重复读(repeatable read,解决幻读)、串行化(serializable,解决幻读)。

持久性(durability):持久性也成为永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来其他操作或故障不应该对其他有任何影响。

任何事务机制在实现时,都应该考虑事务的ACID特性,包括:本地事务、分布式事务,及时不能都很好的满足,也要考虑支持到什么程度。

本地事务 

@Transational

大多数据场景下,我的应用都只需要操作单一的数据库,这种情况下的事务成为本地事务(Local Transaction)。本地事务的ACID特性是数据库直接提供支持的。

1.Seata是什么?

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

官网:https://seata.io/zh-cn/docs/overview/what-is-seata.html

源码:https://github.com/seata/seata

GitHub - seata/seata-samples: seata-samples

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第1张图片

1.1 Seata的三大角色

在Seata的架构中,一共有三个角色:

TC(Transaction Coordinator)- 事务协调者

维护全局和分支事务的状态,驱动全局事务提交和回滚。

TM(Transaction Manager)- 事务管理器

定义全局的事务的范围:开始全局事务、提交或回滚全局事务。

RM(Resource Manager)- 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端。

1.2常用分布式事务解决方案

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

  1. seata 阿里分布式事务框架
  2. 消息队列
  3. saga
  4. XA

四种分布式事务

Seata AT 模式(auto transaction)

AT模式是一种无侵入的分布式事务解决方案
●一阶段:
在一阶段,Seata会拦截“业务SQL”,首先解析SQL语义,找到“业务SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务SQL”更新业务数据,在业务数据更新之后,再将其保存“afger image”,最后生成行锁。以上操作全部再一个数据库事务内完成,这样保证了一阶段操作的原子性。

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第2张图片


●二阶段提交
二阶段如果是提交的话,因为“业务SQL”在一阶段已经提交至数据库,所以Seata框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理。

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第3张图片


●二阶段回滚
二阶段如果是回滚的话,Seata就需要回滚一阶段已经执行的“业务SQL”,还原业务数据。回滚方式是使用“before image”还原业务数据;但在还原前首先要校验脏写,对比“数据库当前业务数据”和“after image”,如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要人工处理。

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第4张图片

Seata TCC 模式

一个分布式的全局事务,整体是 两阶段提交 的模型。全局事务是由若干分支事务组成的,分支事务要满足 两阶段提交 的模型要求,即需要每个分支事务都具备自己的:

  • 一阶段 prepare 行为
  • 二阶段 commit 或 rollback 行为

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第5张图片

根据两阶段行为模式的不同,我们将分支事务划分为 Automatic (Branch) Transaction Mode 和 TCC (Branch) Transaction Mode.

AT 模式(参考链接 TBD)基于 支持本地 ACID 事务 的 关系型数据库

  • 一阶段 prepare 行为:在本地事务中,一并提交业务数据更新和相应回滚日志记录。
  • 二阶段 commit 行为:马上成功结束,自动 异步批量清理回滚日志。
  • 二阶段 rollback 行为:通过回滚日志,自动 生成补偿操作,完成数据回滚。

相应的,TCC 模式,不依赖于底层数据资源的事务支持:

  • 一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
  • 二阶段 commit 行为:调用 自定义 的 commit 逻辑。
  • 二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。

所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。

2.Seata快速开始

2.1 Seata Server (TC)环境搭建

https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html

Server端存储模式(store.mode)支持三种:

  • file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;
  • db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
  • redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

资源目录:

https://github.com/seata/seata/tree/1.4.0/script 

  • client

存放client端sql脚本 (包含 undo_log表) ,参数配置 

  • config-center

各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件

  • server

server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置

db存储模式+Nacos(注册&配置中心)部署

步骤一:下载安装包

seata安装包:https://github.com/seata/seata/releases

版本对应:官方版本说明

 本文使用的是SpringCloudAlibaba 2021.0.1.0,对应的Seata版本下载1.4.2

Spring Cloud Alibaba Version Spring Cloud Version Spring Boot Version

2021.0.1.0

Spring Cloud 2021.0.1

2.6.3

Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Version Dubbo Version Seata Version

2021.0.1.0

1.8.3

1.4.2

4.9.2

~

1.4.2

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第6张图片

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第7张图片

步骤二:配置Seata文件

1、file.conf(seata-server-1.4.2\conf 修改标红的地方,其他的不用改)

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第8张图片

 2、创建seata数据库(SQL脚本从seata资源源码中获取​​​​​​​)

 资源源码:https://github.com/seata/seata/tree/1.4.0/scriptSpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第9张图片

 3、registry.conf(seata-server-1.4.2\conf)注册中心、配置中心

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第10张图片

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第11张图片 

 4、修改资源源码中的config.txt

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第12张图片

 SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第13张图片

步骤三:启动nacos

步骤四:执行nacos-config.sh(只要装了git就可以运行)

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第14张图片

 运行过程会很慢的,执行后会自动注册到nacos中

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第15张图片

步骤五:启动seata

在 Linux/Mac 下

$ sh ./bin/seata-server.sh

在 Windows 下

bin\seata-server.bat

支持的启动参数

参数 全写 作用 备注
-h --host 指定在注册中心注册的 IP 不指定时获取当前的 IP,外部访问部署在云环境和容器中的 server 建议指定
-p --port 指定 server 启动的端口 默认为 8091
-m --storeMode 事务日志存储方式 支持file,db,redis,默认为 file 注:redis需seata-server 1.3版本及以上
-n --serverNode 用于指定seata-server节点ID 如 1,2,3..., 默认为 1
-e --seataEnv 指定 seata-server 运行环境 如 devtest 等, 服务启动时会使用 registry-dev.conf 这样的配置

如:

$ sh ./bin/seata-server.sh -p 8091 -h 127.0.0.1 -m file

 SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第16张图片

3、SpringCloudAlibaba集成Seata 

本文使用的是提前搭建好的分布式项目,订单服务和库存服务

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第17张图片 

3.1 依赖


  com.alibaba.cloud
  spring-cloud-starter-alibaba-seata

 3.2 aplication.yml

#分布式事务
seata:
  tx-service-group: default_tx_group  #配置事务分组  service.vgroupMapping.default_tx_group=default
  registry:
    #配置seata配置中心,告诉seata client 怎么去访问 seata server(TC)
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848  # seata server 所在的nacoas服务地址
      application: seata-server    # 默认名称:seata-server 没有修改可以不配置
      group: SEATA_GROUP # 默认分组:SEATA_GROUP 没有修改可以不配置
      username: nacos
      password: nacos
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      username: nacos
      password: nacos
      group: SEATA_GROUP

核心代码 

SpringCloudAlibaba 2021.0.1.0 版本整合分布式事务Seata_第18张图片 

 发生异常后,订单表数据回滚,库存表数据回滚。

源码:https://gitee.com/zqingcpu/springcloudalibaba-seata.git

你可能感兴趣的:(SpringCloud,Alibaba,spring,cloud)