详解SpringCloud-Alibaba-Seata分布式事务

前言
Seata 是一款阿里巴巴开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。

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

术语

TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
1.
XID:全局唯一事务ID
TC:事务协调器,维护全局事务的运行状态,负责协调并驱动全局的提交或回滚
TM:控制全局事务的边界,负责开启一全局事务,并最终发起全局提交或者回滚的决议
RM:控制分支事务,负责分支注册,状态汇报,并接受事务协调的指令,驱动分支的事务提交或者回滚
2.
TM向TC申请开启一个全局的事务,全局事务创建成功并生成一个唯一的全局ID,XID在微服务调用链路的上下文中传播
RM向TC注册分支事务,将其纳入XID对应事务的 管辖
TM向TC发起针对XID的全局提交或者回滚
TC调度XID下管辖的全部分支事务完成提交或者回滚

官方文档https://seata.io/zh-cn/docs/overview/what-is-seata.html

示例 win版
下载安装
https://github.com/seata/seata/releases/tag/v1.3.0

下载好的包解压 解压

配置 seata
打开\seata\seata\conf 下编辑 file.conf文件

修改数据库模式

file.conf 文件修改链接数据的 信息
修改本地mysql的地址与账号密码

file.conf 中的service也没有手动添加
vgroup_mapping.my_test_tx_group = “default”
default任意定义名字

service {
 #transaction service group mapping
 #修改,可不改,my_test_tx_grou。
 vgroup_mapping.my_test_tx_group = "default"
 #only support when registry.type=file, please don't set multiple addresses
 # 此服务的地址
 default.grouplist = "127.0.0.1:8091"
 #disable seata
 disableGlobalTransaction = false
}

创建数据库 运行官方给的额Sql文件
我草!没有sql脚本, 0.9版本有sql脚本
网上找了一个

DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table` (
 `branch_id` bigint(20) NOT NULL,
 `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 `transaction_id` bigint(20) NULL DEFAULT NULL,
 `resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `status` tinyint(4) NULL DEFAULT NULL,
 `client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `gmt_create` datetime(6) NULL DEFAULT NULL,
 `gmt_modified` datetime(6) NULL DEFAULT NULL,
 PRIMARY KEY (`branch_id`) USING BTREE,
 INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of branch_table
-- ----------------------------

-- ----------------------------
-- Table structure for global_table
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table` (
 `xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 `transaction_id` bigint(20) NULL DEFAULT NULL,
 `status` tinyint(4) NOT NULL,
 `application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `timeout` int(11) NULL DEFAULT NULL,
 `begin_time` bigint(20) NULL DEFAULT NULL,
 `application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `gmt_create` datetime(0) NULL DEFAULT NULL,
 `gmt_modified` datetime(0) NULL DEFAULT NULL,
 PRIMARY KEY (`xid`) USING BTREE,
 INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
 INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of global_table
-- ----------------------------

-- ----------------------------
-- Table structure for lock_table
-- ----------------------------
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table` (
 `row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 `xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `transaction_id` bigint(20) NULL DEFAULT NULL,
 `branch_id` bigint(20) NOT NULL,
 `resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 `gmt_create` datetime(0) NULL DEFAULT NULL,
 `gmt_modified` datetime(0) NULL DEFAULT NULL,
 PRIMARY KEY (`row_key`) USING BTREE,
 INDEX `idx_branch_id`(`branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of lock_table
-- ----------------------------

-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `branch_id` bigint(20) NOT NULL,
 `xid` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 `context` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
 `rollback_info` longblob NOT NULL,
 `log_status` int(11) NOT NULL,
 `log_created` datetime(0) NOT NULL,
 `log_modified` datetime(0) NOT NULL,
 `ext` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
 PRIMARY KEY (`id`) USING BTREE,
 UNIQUE INDEX `ux_undo_log`(`xid`, `branch_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

修改conf文件夹下 registry.conf ,
seata 支持注册nacos 、eureka、redis、zk、consul、etcd3、sofa
本地的nacos的地址

改完配置文件保存 测试
启动ncos 在启动seata

Seata 下bin目录



代码示例
pom

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
   <exclusions>
    <exclusion>
     <artifactId>seata-all</artifactId>
     <groupId>io.seata</groupId>
    </exclusion>
   </exclusions>
  </dependency>
  <dependency>
   <groupId>io.seata</groupId>
   <artifactId>seata-all</artifactId>
   <version>1.3.0</version>
  </dependency>

使用库下创建`undo_log表

drop table `undo_log`;
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;

yml

server:
 port: 2001

spring:
 application:
 name: seata-order-service
 cloud:
 alibaba:
  seata:
  #自定义事务组名称需要与seata-server中的对应
  tx-service-group: default
 nacos:
  discovery:
  server-addr: localhost:8848
 datasource:
 driver-class-name: com.mysql.jdbc.Driver
 url: jdbc:mysql://localhost:3306/seata_order
 username: root
 password: root

feign:
 hystrix:
 enabled: false

logging:
 level:
 io:
  seata: info

mybatis:
 mapperLocations: classpath:mapper/*.xml

file.conf

transport {
 # tcp udt unix-domain-socket
 type = "TCP"
 #NIO NATIVE
 server = "NIO"
 #enable heartbeat
 heartbeat = true
 #thread factory for netty
 thread-factory {
 boss-thread-prefix = "NettyBoss"
 worker-thread-prefix = "NettyServerNIOWorker"
 server-executor-thread-prefix = "NettyServerBizHandler"
 share-boss-worker = false
 client-selector-thread-prefix = "NettyClientSelector"
 client-selector-thread-size = 1
 client-worker-thread-prefix = "NettyClientWorkerThread"
 # netty boss thread size,will not be used for UDT
 boss-thread-size = 1
 #auto default pin or 8
 worker-thread-size = 8
 }
 shutdown {
 # when destroy server, wait seconds
 wait = 3
 }
 serialization = "seata"
 compressor = "none"
}

service {

 vgroup_mapping.fsp_tx_group = "default" 

 default.grouplist = "127.0.0.1:8091"
 enableDegrade = false
 disable = false
 max.commit.retry.timeout = "-1"
 max.rollback.retry.timeout = "-1"
 disableGlobalTransaction = false
}

client {
 async.commit.buffer.limit = 10000
 lock {
 retry.internal = 10
 retry.times = 30
 }
 report.retry.count = 5
 tm.commit.retry.count = 1
 tm.rollback.retry.count = 1
}

## transaction log store
store {
 ## store mode: file、db
 mode = "db"

 ## file store
 file {
 dir = "sessionStore"

 # branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
 max-branch-session-size = 16384
 # globe session size , if exceeded throws exceptions
 max-global-session-size = 512
 # file buffer size , if exceeded allocate new buffer
 file-write-buffer-cache-size = 16384
 # when recover batch read size
 session.reload.read_size = 100
 # async, sync
 flush-disk-mode = async
 }

 ## database store
 db {
 ## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
 datasource = "dbcp"
 ## mysql/oracle/h2/oceanbase etc.
 db-type = "mysql"
 driver-class-name = "com.mysql.jdbc.Driver"
 url = "jdbc:mysql://127.0.0.1:3306/seata"
 user = "root"
 password = "root"
 min-conn = 1
 max-conn = 3
 global.table = "global_table"
 branch.table = "branch_table"
 lock-table = "lock_table"
 query-limit = 100
 }
}
lock {
 ## the lock store mode: local、remote
 mode = "remote"

 local {
 ## store locks in user's database
 }

 remote {
 ## store locks in the seata's server
 }
}
recovery {
 #schedule committing retry period in milliseconds
 committing-retry-period = 1000
 #schedule asyn committing retry period in milliseconds
 asyn-committing-retry-period = 1000
 #schedule rollbacking retry period in milliseconds
 rollbacking-retry-period = 1000
 #schedule timeout retry period in milliseconds
 timeout-retry-period = 1000
}

transaction {
 undo.data.validation = true
 undo.log.serialization = "jackson"
 undo.log.save.days = 7
 #schedule delete expired undo_log in milliseconds
 undo.log.delete.period = 86400000
 undo.log.table = "undo_log"
}

## metrics settings
metrics {
 enabled = false
 registry-type = "compact"
 # multi exporters use comma divided
 exporter-list = "prometheus"
 exporter-prometheus-port = 9898
}

support {
 ## spring
 spring {
 # auto proxy the DataSource bean
 datasource.autoproxy = false
 }
}

registry.conf

registry {
 # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
 type = "nacos"

 nacos {
 serverAddr = "localhost:8848"
 namespace = ""
 cluster = "default"
 }
 eureka {
 serviceUrl = "http://localhost:8761/eureka"
 application = "default"
 weight = "1"
 }
 redis {
 serverAddr = "localhost:6379"
 db = "0"
 }
 zk {
 cluster = "default"
 serverAddr = "127.0.0.1:2181"
 session.timeout = 6000
 connect.timeout = 2000
 }
 consul {
 cluster = "default"
 serverAddr = "127.0.0.1:8500"
 }
 etcd3 {
 cluster = "default"
 serverAddr = "http://localhost:2379"
 }
 sofa {
 serverAddr = "127.0.0.1:9603"
 application = "default"
 region = "DEFAULT_ZONE"
 datacenter = "DefaultDataCenter"
 cluster = "default"
 group = "SEATA_GROUP"
 addressWaitTime = "3000"
 }
 file {
 name = "file.conf"
 }
}

config {
 # file、nacos 、apollo、zk、consul、etcd3
 type = "file"

 nacos {
 serverAddr = "localhost"
 namespace = ""
 }
 consul {
 serverAddr = "127.0.0.1:8500"
 }
 apollo {
 app.id = "seata-server"
 apollo.meta = "http://192.168.1.204:8801"
 }
 zk {
 serverAddr = "127.0.0.1:2181"
 session.timeout = 6000
 connect.timeout = 2000
 }
 etcd3 {
 serverAddr = "http://localhost:2379"
 }
 file {
 name = "file.conf"
 }
}
@GlobalTransactional(name = "tang,rollbackFor = Exception.class)开启全局事物
@Override
 @GlobalTransactional(name = "tang,rollbackFor = Exception.class)
 public void create(Providers providers ){
  test1Mapper.add(providers);
  test2Mapper.add(providers)
  }

到此这篇关于SpringCloud-Alibaba-Seata分布式事务的文章就介绍到这了,更多相关SpringCloud-Alibaba-Seata分布式事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Springcloud seata分布式事务实现代码解析

    Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.本篇不涉及其原理,只用代码构建项目简单试用一下其回滚的机制. 大致上seata分为TC,TM,RM三大构建成整体.它们之间的包含关系如下.即一(xid主键编码,记录信息)带三(TC,TM,RM) 下面之间构建项目进行测试. 1.下载seata并解压,然后改动配置文件. http://seata.io/zh-cn/blog/download.html官网下载. 解压之后到conf中修改file和registry

  • SpringCloud Alibaba Seata (收藏版)

    一.简介 官网地址: http://seata.io/zh-cn/ 1,概念 Seata是一款开源的分布式事务解决方案,致力于在微服务架构在提供高性能和简单一样的分布式事务服务. 2,处理过程 Transaction ID XID:全局唯一的事务ID Transaction Coordinator(TC) :维护全局和分支事务的状态,驱动全局事务提交或回滚. Transaction Manager™ :定义全局事务的范围:开始全局事务.提交或回滚全局事务. Resource Manager(RM

  • SpringCloud-Alibaba-Nacos启动失败解决方案

    下载及启动 Nacos 下载地址:https://github.com/alibaba/nacos/releases 在Windows下,进入bin目录,双击 startup.cmd 即可运行 启动出现问题 问题:双击 startup.cmd 启动失败,窗口一闪而过 你需要先去试试你的 Tomcat 能否启动:进入 Tomcat 安装目录 bin 文件夹,双击 startup.bat 如果能正常启动,出门右转,下面的不用看了

  • SpringCloud+RocketMQ实现分布式事务的实践

    目录 一.RocketMQ的分布式事务结构和说明 二.搭建RocketMQ 三.事务场景,然后准备工程,运行代码 随着互联网公司的微服务越来越多,分布式事务已经成为了我们的经常使用的.所以我们来一步一步的实现基于RocketMQ的分布式事务.接下来,我们将要做的主题写出来. RocketMQ的分布式事务结构和说明 搭建RocketMQ步骤 事务场景,然后准备工程,运行代码 一.RocketMQ的分布式事务结构和说明 我们通过下图来了解一下RocketMQ实现分布式事务的结构.采用半消息机制实现分

  • 详解SpringCloud服务认证(JWT)

     - JWT JWT(JSON Web Token), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景.JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密. - JWT与其它的区别 通常情况下,把API直接暴露出去是风险很大的,不说别的

  • 详解springboot+aop+Lua分布式限流的最佳实践

    一.什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤.列车的超载,存在一定的安全隐患.同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃.为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间. 限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,

  • 详解通过SQL进行分布式死锁的检测与消除

    概述 分布式数仓应用场景中,我们经常遇到数据库系统 hang 住的问题,所谓 hang 是指虽然数据库系统还在运行,但部分或全部业务无法正常执行.hang 问题的原因有很多,其中以分布式死锁最为常见,本次主要分享在碰到死锁时,如何快速地解决死锁问题. GaussDB(DWS) 作为分布式数仓,通过锁机制来实行并发控制,因此也存在产生分布式死锁的可能.虽然分布式死锁无法避免,但幸运的是其提供了多种系统视图,能够保证在分布式死锁发生之后,快速地对死锁进行定位. 本文主要介绍了在 GaussDB(DW

  • 详解GaussDB(DWS) explain分布式执行计划的示例

    摘要:本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点.前言 执行计划(又称解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等.如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划.本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点. 1.执行算子介绍 要读懂执行计划,首先要知道数据库执行算子的概念: 下面重点介绍下基于sharing n

  • 详解RedisTemplate下Redis分布式锁引发的系列问题

    自己的项目因为会一直抓取某些信息,但是本地会和线上经常一起跑,造成冲突.这其实就是我们常说的分布式集群的问题了,本地和线上的服务器构成了集群以及QPS为2的小并发(其实也不叫并发,不知道拿什么词形容?). 首先,分布式集群的问题大家都知道,会造成数据库的插入重复问题,会造成一系列的并发性问题. 解决的方式呢也大概如下几点,百度以及谷歌上都能搜到的解决方式: 1:数据库添加唯一索引 2:设计接口幂等性 3:依靠中间件使用分布式锁,而分布式锁又分为Redis和Zookeeper 由于Zookeepe

  • 详解基于redis实现分布式锁

    前言 为了保证一个在高并发存场景下只能被同一个线程操作,java并发处理提供ReentrantLock或Synchronized进行互斥控制.但是这仅仅对单机环境有效.我们实现分布式锁大概通过三种方式. redis实现分布式锁 数据库实现分布式锁 zk实现分布式锁 原理剖析 上述三种分布式锁都是通过各自为依据对各个请求进行上锁,解锁从而控制放行还是拒绝.redis锁是基于其提供的setnx命令. setnx当且仅当key不存在.若给定key已经存在,则setnx不做任何动作.setnx是一个原子

  • 详解SpringCloud新一代网关Gateway

    一.概述简介 1.1.简介 SpringCloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 1.x非Reactor模式的老版本.而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty. Spring Cloud Gat

  • 详解SpringCloud的负载均衡

    目录 一.什么是负载均衡 二.负载均衡的简单分类 三.为什么需要做负载均衡 四.springCloud如何开启负载均衡 五.IRule 1.RandomRule:表示随机策略,它将从服务清单中随机选择一个服务: 2.ClientConfigEnabledRoundRobinRule:ClientConfigEnabledRoundRobinRule并没有实现什么特殊的处理逻辑,但是他的子类可以实现一些高级策略, 当一些本身的策略无法实现某些需求的时候,它也可以做为父类帮助实现某些策略,一般情况下

随机推荐