项目依赖
- SpringBoot 2.5.5
- SpringCloud 2020.0.4
- Alibaba Spring Cloud 2021.1
- Mybatis Plus 3.4.0
- Seata 1.4.1(需要与服务器部署的Seata版本保持一致)
- 。。。。
- 一个开源分布式事务框架,由阿里中间件团队发起的开源项目Fescar,后更名为Seata
- 中文文档地址:http://seata.io/zh-cn/docs/user/quickstart.html
- TC:Transaction Coordinator事务协调器,管理全局的分支事务的状态 , 用于全局性事务的提交和回滚
- TM:Transaction Manager 事务管理器 , 用户开启、提交或者回滚【全局事务】
- RM:Resource Manager资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接收TC的命令来提交或者回滚分支事务
- 传统XA协议实现2PC方案的RM是在数据库层,RM本质上就是数据库自身
- Seata的RM是以jar包的形式嵌入在应用程序里面
![SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截](http://img.zhejianglong.com/231018/2151232924-0.png)
文章插图
XID
- TM请求TC开启一个全局事务,TC会生成一个XID作为该全局事务的编号XID,XID会在微服务的调用链路中传播 , 保证将多个微服务对的子事务关联在一起
![SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截](http://img.zhejianglong.com/231018/2151233441-1.jpg)
文章插图
注:我这边下载的是1.4.1,seata部署版本需要与SpringBoot依赖的版本相对应?。。。。。?
Seata部署前期准备准备好Nacos、mysql
注:nacos配置中心数据是持久化到mysql的?。。。?
部署&修改配置修改存储模式DB上传至服务器,目录为:/usr/local/software
# 1、创建目录mkdir -p /usr/local/software# 2、解压unzip seata-server-1.4.1.zip# 3、修改存储模式 DBcd seata/conf/vi file.conf
![SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截](http://img.zhejianglong.com/231018/215123A20-2.jpg)
文章插图
注:修改为自己的mysql?。。。?
## transaction log store, only used in seata-serverstore {## store mode: file、db、redismode = "file"## database store propertydb {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql"driverClassName = "com.mysql.cj.jdbc.Driver"url = "jdbc:mysql://47.116.143.16:3306/seata?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai"user = "root"password = "root"minConn = 5maxConn = 100globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}}将seata需要的3张表导入数据库中,分别是:global_table、branch_table、lock_table
官网地址:http://seata.io/zh-cn/docs/user/quickstart.html
github地址:https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql
![SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截](http://img.zhejianglong.com/231018/21512333H-3.jpg)
文章插图
![SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截](https://m.360buyimg.com/jdcms/jfs/t1/43813/38/20204/80/6356116dE83b915d1/5192b24265d14815.gif)
文章插图
![SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截](https://m.360buyimg.com/jdcms/jfs/t1/99783/23/34472/79/6356116dE909468b3/994b35621d8de041.gif)
文章插图
-- -------------------------------- The script used when storeMode is 'db' ---------------------------------- the table to store GlobalSession dataCREATE TABLE IF NOT EXISTS `global_table`(`xid`VARCHAR(128) NOT NULL,`transaction_id`BIGINT,`status`TINYINTNOT NULL,`application_id`VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name`VARCHAR(128),`timeout`INT,`begin_time`BIGINT,`application_data`VARCHAR(2000),`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARY KEY (`xid`),KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),KEY `idx_transaction_id` (`transaction_id`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store BranchSession dataCREATE TABLE IF NOT EXISTS `branch_table`(`branch_id`BIGINTNOT NULL,`xid`VARCHAR(128) NOT NULL,`transaction_id`BIGINT,`resource_group_id` VARCHAR(32),`resource_id`VARCHAR(256),`branch_type`VARCHAR(8),`status`TINYINT,`client_id`VARCHAR(64),`application_data`VARCHAR(2000),`gmt_create`DATETIME(6),`gmt_modified`DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;-- the table to store lock dataCREATE TABLE IF NOT EXISTS `lock_table`(`row_key`VARCHAR(128) NOT NULL,`xid`VARCHAR(128),`transaction_id` BIGINT,`branch_id`BIGINTNOT NULL,`resource_id`VARCHAR(256),`table_name`VARCHAR(32),`pk`VARCHAR(36),`status`TINYINTNOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',`gmt_create`DATETIME,`gmt_modified`DATETIME,PRIMARY KEY (`row_key`),KEY `idx_status` (`status`),KEY `idx_branch_id` (`branch_id`),KEY `idx_xid` (`xid`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;CREATE TABLE IF NOT EXISTS `distributed_lock`(`lock_key`CHAR(20) NOT NULL,`lock_value`VARCHAR(20) NOT NULL,`expire`BIGINT,primary key (`lock_key`)) ENGINE = InnoDBDEFAULT CHARSET = utf8mb4;INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
推荐阅读
- MassTransit | .NET 分布式应用框架
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- SpringBoot整合ES+Kibana
- 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践
- 微服务系列之分布式日志 ELK
- Dubbo2.7详解
- 四 SpringBoot - 整合Mybatis,逆向工程,JPA
- 撸了一个简易的配置中心,顺带整合到了SpringCloud
- 【Spring boot】整合tomcat底层原理
- 15 基于SqlSugar的开发框架循序渐进介绍-- 整合代码生成工具进行前端界面的生成