公司网站建设计入明细科目,深圳最好的区排名,网站搭建好之后提示网页走丢了,南宁seo平台标准文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程… 文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程分析TCC模式原理事务悬挂和空回滚实现TCC模式 SAGA模式原理四种模式对比 高可用高可用架构模型实现高可用模拟异地容灾的TC集群将事务组映射配置到nacos微服务读取nacos配置 分布式事务问题
本地事务
本地事务也就是传统的单机事务。在传统数据库事务中必须要满足四个原则
分布式事务
分布式事务就是指不是在单个服务或单个数据库架构下产生的事务例如
跨数据源的分布式事务跨服务的分布式事务综合情况 在数据库水平拆分、服务垂直拆分之后一个业务操作通常要跨多个数据库、服务才能完成。例如电商行业中比较常见的下单付款案例包括下面几个行为
创建新订单扣减商品库存从用户账户余额扣除金额
完成上面的操作需要访问三个不同的微服务和三个不同的数据库 订单的创建、库存的扣减、账户扣款在每一个服务和数据库内是一个本地事务可以保证ACID原则。
但是当我们把三件事情看做一个业务要满足保证“业务”的原子性要么所有操作全部成功要么全部失败不允许出现部分成功部分失败的现象这就是分布式系统下的事务了
此时ACID难以满足这是分布式事务要解决的问题
演示分布式事务问题
我们通过一个案例来演示分布式事务的问题 创建数据库名为seata_demo然后导入课前资料提供的SQL文件 导入课前资料提供的微服务 微服务结构如下 其中 seata-demo父工程负责管理项目依赖 account-service账户服务负责管理用户的资金账户。提供扣减余额的接口storage-service库存服务负责管理商品库存。提供扣减库存的接口order-service订单服务负责管理订单。创建订单时需要调用account-service和storage-service 启动nacos、所有微服务 测试下单功能发出Post请求 http://localhost:8082/order?userIduser202103032042012commodityCode100202003032041count2money200如图 测试发现当库存不足时如果余额已经扣减并不会回滚出现了分布式事务问题
理论基础 解决分布式事务问题需要一些分布式系统的基础知识作为理论指导 CAP定理
1998年加州大学的计算机科学家 Eric Brewer 提出分布式系统有三个指标
Consistency一致性Availability可用性Partition tolerance 分区容错性
它们的第一个字母分别是 C、A、P Eric Brewer 说这三个指标不可能同时做到。这个结论就叫做 CAP 定理 一致性
Consistency一致性用户访问分布式系统中的任意节点得到的数据必须一致
比如现在包含两个节点其中的初始数据是一致的 当我们修改其中一个节点的数据时两者的数据产生了差异 要想保住一致性就必须实现node01 到 node02的数据 同步
可用性
Availability 可用性用户访问集群中的任意健康节点必须能得到响应而不是超时或拒绝
如图有三个节点的集群访问任何一个都可以及时得到响应 当有部分节点因为网络故障或其它原因无法访问时代表节点不可用
分区容错
Partition分区因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接形成独立分区 Tolerance容错在集群出现分区时整个系统也要持续对外提供服务
矛盾
在分布式系统中系统间的网络不能100%保证健康一定会有故障的时候而服务有必须对外保证服务。因此Partition Tolerance不可避免
当节点接收到新的数据变更时就会出现问题了 如果此时要保证一致性就必须等待网络恢复完成数据同步后整个集群才对外提供服务服务处于阻塞状态不可用
如果此时要保证可用性就不能等待网络恢复那node01、node02与node03之间就会出现数据不一致
也就是说在P一定会出现的情况下A和C之间只能实现一个
BASE理论 BASE理论是对CAP的一种解决思路包含三个思想 Basically Available基本可用分布式系统在出现故障时允许损失部分可用性即保证核心可用Soft State软状态在一定时间内允许出现中间状态比如临时的不一致状态Eventually Consistent最终一致性虽然无法保证强一致性但是在软状态结束后最终达到数据一致 分布式事务最大的问题是各个子事务的一致性问题因此可以借鉴CAP定理和BASE理论有两种解决思路
AP模式各子事务分别执行和提交允许出现结果不一致然后采用弥补措施恢复数据即可实现最终一致CP模式各个子事务执行后互相等待同时提交同时回滚达成强一致。但事务等待过程中处于弱可用状态 但不管是哪一种模式都需要在子系统事务之间互相通讯协调事务状态也就是需要一个事务协调者(TC) 这里的子系统事务称为分支事务有关联的各个分支事务在一起称为全局事务
Seata
Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务为用户打造一站式的分布式解决方案
官网地址其中的文档、播客中提供了大量的使用说明、源码分析
Seata的架构
Seata事务管理中有三个重要的角色
TC (Transaction Coordinator) - **事务协调者**维护全局和分支事务的状态协调全局事务提交或回滚TM (Transaction Manager) - **事务管理器**定义全局事务的范围、开始全局事务、提交或回滚全局事务RM (Resource Manager) - **资源管理器**管理分支事务处理的资源与TC交谈以注册分支事务和报告分支事务的状态并驱动分支事务提交或回
Seata基于上述架构提供了四种不同的分布式事务解决方案
XA模式强一致性分阶段事务模式牺牲了一定的可用性无业务侵入TCC模式最终一致的分阶段事务模式有业务侵入AT模式最终一致的分阶段事务模式无业务侵入也是Seata的默认模式SAGA模式长事务模式有业务侵入
无论哪种方案都离不开TC也就是事务的协调者
部署TC服务 首先我们要下载seata-server包 解压 修改conf目录下的application.example.yml文件 修改完application.example.yml后在修改application.yml文件注意application.yml初始状态没有下图那么多配置需要把application.example.yml中对应nacos配置复制到里面去 在nacos添加配置 特别注意为了让tc服务的集群可以共享配置我们选择了nacos作为统一配置中心。因此服务端配置文件seataServer.properties文件需要在nacos中配好 格式如下 配置内容如下 # 数据存储方式db代表数据库
store.modedb
store.db.datasourcedruid
store.db.dbTypemysql
store.db.driverClassNamecom.mysql.jdbc.Driver
store.db.urljdbc:mysql://127.0.0.1:3306/seata?useUnicodetruerewriteBatchedStatementstrue
store.db.userroot
store.db.password123456
store.db.minConn5
store.db.maxConn30
store.db.globalTableglobal_table
store.db.branchTablebranch_table
store.db.queryLimit100
store.db.lockTablelock_table
store.db.maxWait5000
# 事务、日志等配置
server.recovery.committingRetryPeriod1000
server.recovery.asynCommittingRetryPeriod1000
server.recovery.rollbackingRetryPeriod1000
server.recovery.timeoutRetryPeriod1000
server.maxCommitRetryTimeout-1
server.maxRollbackRetryTimeout-1
server.rollbackRetryTimeoutUnlockEnablefalse
server.undo.logSaveDays7
server.undo.logDeletePeriod86400000# 客户端与服务端传输方式
transport.serializationseata
transport.compressornone
# 关闭metrics功能提高性能
metrics.enabledfalse
metrics.registryTypecompact
metrics.exporterListprometheus
metrics.exporterPrometheusPort9898其中的数据库地址、用户名、密码都需要修改成你自己的数据库信息 创建数据库表 CREATE DATABASE seata;
USE seata;SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS 0;-- ----------------------------
-- 分支事务表
-- ----------------------------
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 Compact;-- ----------------------------
-- 全局事务表
-- ----------------------------
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 NULL DEFAULT NULL,gmt_modified datetime 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 Compact;SET FOREIGN_KEY_CHECKS 1;进入bin目录运行其中的seata-server.bat即可 - 启动成功后seata-server应该已经注册到nacos注册中心了 打开浏览器访问nacos地址然后进入服务列表页面可以看到seata-tc-server的信息
微服务集成seata 引入依赖 dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactIdexclusions!--版本较低1.3.0因此排除--exclusionartifactIdseata-spring-boot-starter/artifactIdgroupIdio.seata/groupId/exclusion/exclusions
/dependency
!--seata starter 采用1.4.2版本--
dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion${seata.version}/version
/dependency需要修改application.yml文件添加一些配置 seata:registry: # TC服务注册中心的配置微服务根据这些信息去注册中心获取tc服务地址# 参考tc服务自己的registry.conf中的配置type: nacosnacos: # tcserver-addr: 127.0.0.1:8848namespace: group: DEFAULT_GROUPapplication: seata-tc-server # tc服务在nacos中的服务名称tx-service-group: seata-demo # 事务组根据这个获取tc服务的cluster名称service:vgroup-mapping: # 事务组与TC服务cluster的映射关系seata-demo: GZ动手实践
XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理DTPDistributed Transaction Processing标准XA 规范 描述了全局的TM与局部的RM之间的接口几乎所有主流的数据库都对 XA 规范 提供了支持 两阶段提交 XA是规范目前主流数据库都实现了这种规范实现的原理都是基于两阶段提交 一阶段
事务协调者通知每个事物参与者执行本地事务本地事务执行完成后报告事务执行状态给事务协调者此时事务不提交继续持有数据库锁
二阶段
事务协调者基于一阶段的报告来判断下一步操作 如果一阶段都成功则通知所有事务参与者提交事务如果一阶段任意一个参与者失败则通知所有事务参与者回滚事务 正常情况 异常情况
Seata的XA模型
Seata对原始的XA模式做了简单的封装和改造以适应自己的事务模型基本架构如图 RM一阶段的工作
注册分支事务到TC执行分支业务sql但不提交报告执行状态到TC
TC二阶段的工作
TC检测各分支事务执行状态 a.如果都成功通知所有RM提交事务 b.如果有失败通知所有RM回滚事务
RM二阶段的工作
接收TC指令提交或回滚事务
实现XA模式 修改application.yml文件每个参与事务的微服务开启XA模式 seata:data-source-proxy-mode: XA给发起全局事务的入口方法添加GlobalTransactional注解:
AT模式 AT模式同样是分阶段提交的事务模型不过缺弥补了XA模型中资源锁定周期过长的缺陷 Seata的AT模型
基本流程图 阶段一RM的工作
注册分支事务记录undo-log数据快照执行业务sql并提交报告事务状态
阶段二提交时RM的工作
删除undo-log即可
阶段二回滚时RM的工作
根据undo-log恢复数据到更新前
流程梳理
我们用一个真实的业务来梳理下AT模式的原理
比如现在又一个数据库表记录用户余额
idmoney1100
其中一个分支业务要执行的SQL为
update tb_account set money money - 10 where id 1AT模式下当前分支事务执行流程如下 一阶段 TM发起并注册全局事务到TCTM调用分支事务分支事务准备执行业务SQLRM拦截业务SQL根据where条件查询原始数据形成快照。{id: 1, money: 100
}RM执行业务SQL提交本地事务释放数据库锁。此时 money 90RM报告本地事务状态给TC 二阶段 TM通知TC事务结束 TC检查分支事务状态 如果都成功则立即删除快照如果有分支事务失败需要回滚。读取快照数据{id: 1, money: 100}将快照恢复到数据库。此时数据库再次恢复为100
脏写问题
在多线程并发访问AT模式的分布式事务时有可能出现脏写问题如图 解决思路就是引入了全局锁的概念。在释放DB锁之前先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据
实现AT模式 AT模式中的快照生成、回滚等动作都是由框架自动完成没有任何代码侵入因此实现非常简单 只不过AT模式需要一个表来记录全局锁、另一张表来记录数据快照undo_log 导入课前资料提供的Sql文件seata-at.sql其中lock_table导入到TC服务关联的数据库undo_log表导入到微服务关联的数据库 修改application.yml文件将事务模式修改为AT模式即可 seata:data-source-proxy-mode: AT # 默认就是AT给发起全局事务的入口方法添加GlobalTransactional注解:
TCC模式
TCC模式与AT模式非常相似每阶段都是独立事务不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法
Try资源的检测和预留Confirm完成资源操作业务要求 Try 成功 Confirm 一定要能成功。Cancel预留资源释放可以理解为try的反向操作
流程分析
举例一个扣减用户余额的业务。假设账户A原来余额是100需要余额扣减30
阶段一 Try 检查余额是否充足如果充足则冻结金额增加30元可用余额扣除30 初识余额 余额充足可以冻结 此时总金额 冻结金额 可用金额数量依然是100不变。事务直接提交无需等待其它事务阶段二Confirm)假如要提交Confirm则冻结金额扣减30 确认可以提交不过之前可用金额已经扣减过了这里只要清除冻结金额就好了 此时总金额 冻结金额 可用金额 0 70 70元阶段二(Canncel)如果要回滚Cancel则冻结金额扣减30可用余额增加30 需要回滚那么就要释放冻结金额恢复可用金额
TCC模式原理
Seata中的TCC模型依然延续之前的事务架构如图
事务悬挂和空回滚 空回滚 当某分支事务的try阶段阻塞时可能导致全局事务超时而触发二阶段的cancel操作。在未执行try操作时先执行了cancel操作这时cancel不能做回滚就是空回滚 执行cancel操作时应当判断try是否已经执行如果尚未执行则应该空回滚 业务悬挂 对于已经空回滚的业务之前被阻塞的try操作恢复继续执行try就永远不可能confirm或cancel 事务一直处于中间状态这就是业务悬挂 执行try操作时应当判断cancel是否已经执行过了如果已经执行应当阻止空回滚后的try操作避免悬挂
实现TCC模式
这里我们定义一张表
USE seata_demo;DROP TABLE IF EXISTS account_freeze_tbl;
CREATE TABLE account_freeze_tbl (xid VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,user_id VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,freeze_money INT(11) UNSIGNED NULL DEFAULT 0,state INT(1) NULL DEFAULT NULL COMMENT 事务状态0:try1:confirm2:cancel,PRIMARY KEY (xid) USING BTREE
) ENGINE INNODB CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT COMPACT;其中
xid是全局事务idfreeze_money用来记录用户冻结金额state用来记录事务状态
那此时我们的业务开怎么做呢
Try业务 记录冻结金额和事务状态到account_freeze表扣减account表可用金额 Confirm业务 根据xid删除account_freeze表的冻结记录 Cancel业务 修改account_freeze表冻结金额为0state为2修改account表恢复可用金额 如何判断是否空回滚 cancel业务中根据xid查询account_freeze如果为null则说明try还没做需要空回滚 如何避免业务悬挂 try业务中根据xid查询account_freeze 如果已经存在则证明Cancel已经执行拒绝执行try业务 接下来我们改造account-service利用TCC实现余额扣减功能
声明TCC接口 TCC的Try、Confirm、Cancel方法都需要在接口中基于注解来声明 我们在account-service项目中的cn.itcast.account.service包中新建一个接口声明TCC三个接口
LocalTCC
public interface AccountTCCService {TwoPhaseBusinessAction(name deduct, commitMethod confirm, rollbackMethod cancel)void deduct(BusinessActionContextParameter(paramName userId) String userId,BusinessActionContextParameter(paramName money)int money);boolean confirm(BusinessActionContext ctx);boolean cancel(BusinessActionContext ctx);
}创建相关实体类与mapper 编写实现类在account-service服务中的cn.itcast.account.service.impl包下新建一个类实现TCC业务
Slf4j
Service
public class AccountTCCServiceImpl implements AccountTCCService {Autowiredprivate AccountMapper accountMapper;Autowiredprivate AccountFreezeMapper accountFreezeMapper;OverrideTransactionalpublic void deduct(String userId, int money) {// 1.获取事务idString xid RootContext.getXID();// 2.判断freeze中是否有冻结记录如果有一定是CANCEL执行过我要拒绝AccountFreeze oldFreeze accountFreezeMapper.selectById(xid);if (oldFreeze ! null) {// CANCEL执行过我要拒绝额业务return;}// 3.扣减可用余额accountMapper.deduct(userId, money);// 4.记录冻结金额事务状态AccountFreeze freeze new AccountFreeze();freeze.setUserId(userId);freeze.setFreezeMoney(money);freeze.setState(AccountFreeze.State.TRY);freeze.setXid(xid);accountFreezeMapper.insert(freeze);}Overridepublic boolean confirm(BusinessActionContext ctx) {// 1.获取事务IdString xid ctx.getXid();// 2.根据Id删除记录int flag accountFreezeMapper.deleteById(xid);return flag 1;}Overridepublic boolean cancel(BusinessActionContext ctx) {// 1.查询冻结记录String xid ctx.getXid();AccountFreeze freeze accountFreezeMapper.selectById(xid);String userId ctx.getActionContext(userId).toString();// 2.空回滚的判断判断freeze是否为null为null镇命歌try没执行需要空回滚if (freeze null) {// 证明try没有执行需要空回滚freeze new AccountFreeze();freeze.setUserId(userId);freeze.setFreezeMoney(0);freeze.setState(AccountFreeze.State.CANCEL);freeze.setXid(xid);accountFreezeMapper.insert(freeze);return true;}// 3.幂等判断if (freeze.getState() AccountFreeze.State.CANCEL) {// 已经处理过一次CANCEL了无需重复处理return true;}// 4.恢复可用余额accountMapper.refund(freeze.getUserId(), freeze.getFreezeMoney());// 5.将动静金额清零状态改为CANCELfreeze.setFreezeMoney(0);freeze.setState(AccountFreeze.State.CANCEL);int flag accountFreezeMapper.updateById(freeze);return flag 1;}
}注入AccountTCCService
SAGA模式
Saga 模式是 Seata 即将开源的长事务解决方案将由蚂蚁金服主要贡献。 其理论基础是Hector Kenneth 在1987年发表的论文Sagas。 Seata官网对于Saga的指南
原理 在 Saga 模式下分布式事务内有多个参与者每一个参与者都是一个冲正补偿服务需要用户根据业务场景实现其正向操作和逆向回滚操作 分布式事务执行过程中依次执行各参与者的正向操作如果所有正向操作均执行成功那么分布式事务提交。如果任何一个正向操作执行失败那么分布式事务会去退回去执行前面各参与者的逆向回滚操作回滚已提交的参与者使分布式事务回到初始状态 Saga也分为两个阶段
一阶段直接提交本地事务二阶段成功则什么都不做失败则通过编写补偿业务来回滚
四种模式对比
XAATTCCSAGA一致性强一致弱一致弱一致最终一致隔离性完全隔离基于全局锁隔离基于资源预留隔离无隔离代码侵入无无要编写三个接口要编写状态机和补偿业务性能差好非常好非常好场景对一致性、隔离性有高要求的业务基于关系型数据库的大多数分布式事务场景都可以- 对性能要求较高的事务-有非关系型数据库要参与的事务- 业务流长、业务流程多- 参与者包含其它公司或遗留系统服务无法提供 TCC模式要求的三个接口
高可用 Seata的TC服务作为分布式事务核心一定要保证集群的高可用性 高可用架构模型
搭建TC服务集群非常简单启动多个TC服务注册到nacos即可
但集群并不能确保100%安全万一集群所在机房故障怎么办所以如果要求较高一般都会做异地多机房容灾 比如一个TC集群在上海另一个TC集群在杭州
实现高可用
模拟异地容灾的TC集群
计划启动两台seata的tc服务节点
节点名称ip地址端口号集群名称seata127.0.0.18091GZseata2127.0.0.18092TJ
之前我们已经启动了一台seata服务端口是8091集群名为GZ 现在将seata目录复制一份起名为seata2 修改conf目录下的application.example.yml文件并复制到application.yml文件 进入seata2/bin目录然后运行命令seata-server.bat -p 8092
打开nacos控制台查看服务列表 点进详情查看
将事务组映射配置到nacos 接下来我们需要将tx-service-group与cluster的映射关系都配置到nacos配置中心 新建一个配置 配置内容如下 # 事务组映射关系
service.vgroupMapping.seata-demoGZservice.enableDegradefalse
service.disableGlobalTransactionfalse
# 与TC服务的通信配置
transport.typeTCP
transport.serverNIO
transport.heartbeattrue
transport.enableClientBatchSendRequestfalse
transport.threadFactory.bossThreadPrefixNettyBoss
transport.threadFactory.workerThreadPrefixNettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefixNettyServerBizHandler
transport.threadFactory.shareBossWorkerfalse
transport.threadFactory.clientSelectorThreadPrefixNettyClientSelector
transport.threadFactory.clientSelectorThreadSize1
transport.threadFactory.clientWorkerThreadPrefixNettyClientWorkerThread
transport.threadFactory.bossThreadSize1
transport.threadFactory.workerThreadSizedefault
transport.shutdown.wait3
# RM配置
client.rm.asyncCommitBufferLimit10000
client.rm.lock.retryInterval10
client.rm.lock.retryTimes30
client.rm.lock.retryPolicyBranchRollbackOnConflicttrue
client.rm.reportRetryCount5
client.rm.tableMetaCheckEnablefalse
client.rm.tableMetaCheckerInterval60000
client.rm.sqlParserTypedruid
client.rm.reportSuccessEnablefalse
client.rm.sagaBranchRegisterEnablefalse
# TM配置
client.tm.commitRetryCount5
client.tm.rollbackRetryCount5
client.tm.defaultGlobalTransactionTimeout60000
client.tm.degradeCheckfalse
client.tm.degradeCheckAllowTimes10
client.tm.degradeCheckPeriod2000# undo日志配置
client.undo.dataValidationtrue
client.undo.logSerializationjackson
client.undo.onlyCareUpdateColumnstrue
client.undo.logTableundo_log
client.undo.compress.enabletrue
client.undo.compress.typezip
client.undo.compress.threshold64k
client.log.exceptionRate100微服务读取nacos配置
接下来需要修改每一个微服务的application.yml文件让微服务读取nacos中的client.properties文件
seata:config:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUPdata-id: client.properties重启微服务现在微服务到底是连接tc的GZ集群还是tc的TJ集群都统一由nacos的client.properties来决定了