当前位置: 首页 > news >正文

江苏省建设注册中心网站用dreamware制作网页

江苏省建设注册中心网站,用dreamware制作网页,合肥瑶海区有什么大学,房屋建设设计网站分布式事务事务的ACID原则分布式事务理论基础CAP定理BASE理论Seataseata的部署seata的集成事务模式XA模式Seata的XA模型优缺点实现XA模式AT模式案例#xff1a;AT模式更新数据脏写问题优缺点实现AT模式TCC模式流程分析Seata的TCC模型事务悬挂和空回滚实现TCC模式优缺点SAGA模式… 分布式事务事务的ACID原则分布式事务理论基础CAP定理BASE理论Seataseata的部署seata的集成事务模式XA模式Seata的XA模型优缺点实现XA模式AT模式案例AT模式更新数据脏写问题优缺点实现AT模式TCC模式流程分析Seata的TCC模型事务悬挂和空回滚实现TCC模式优缺点SAGA模式优缺点高可用TC服务的高可用和异地容灾事务的ACID原则 本地事务也就是传统的单机事务。在传统数据库事务中必须要满足四个原则 分布式事务就是指不是在单个服务或单个数据库架构下产生的事务例如 跨数据源的分布式事务跨服务的分布式事务综合情况 在数据库水平拆分、服务垂直拆分之后一个业务操作通常要跨多个数据库、服务才能完成。 比如电商行业中比较常见的下单付款案例包括创建新订单扣减商品库存从用户账户余额扣除金额完成以上操作需要访问三个不同的微服务和三个不同的数据库。 订单的创建、库存的扣减、账户扣款在每一个服务和数据库内是一个本地事务可以保证ACID原则。但是当把三件事情看做一个业务要满足保证“业务”的原子性要么所有操作全部成功要么全部失败不允许出现部分成功部分失败的现象ACID难以满足是分布式事务要解决的问题了。 分布式事务理论基础 CAP定理 1998年加州大学的计算机科学家 Eric Brewer 提出分布式系统有三个指标。 Consistency一致性用户访问分布式系统中的任意节点得到的数据必须一致。 当node01数据改变时要保住一致性就必须实现node01到node02的数据同步。 Availability可用性用户访问集群中的任意健康节点必须得到响应而不是超时或拒绝。 有三个节点的集群访问任何一个都可以及时得到响应当有部分节点因为网络故障或其它原因无法访问时代表节点不可用。 Partition tolerance(分区容错性) Partition分区因为网络故障或其他原因导致分布式系统中的部门节点与其他节点失去连接形成独立分区。Tolerance容错在集群出现分区时整个系统也要持续对外提供服务 在分布式系统中系统间的网络不能100%保证健康一定会有故障的时候而服务有必须对外保证服务。因此Partition Tolerance不可避免。 当节点接收到新的数据变更时就会出现问题了 如果此时要保证一致性就必须等待网络恢复完成数据同步后整个集群才对外提供服务服务处于阻塞状态不可用。如果此时要保证可用性就不能等待网络恢复那node01、node02与node03之间就会出现数据不一致。 在P一定会出现的情况下A和C之间只能实现一个。Eric Brewer 说这三个指标不可能同时做到。这个结论就叫做 CAP 定理。 简述CAP定理内容 分布式系统节点通过网络连接一定会出现分区问题§当分区出现时系统的一致性©和可用性(A)就无法同时满足 elasticsearch集群是CP还是AP ES集群出现分区时故障节点会被剔除集群数据分片会重新分配到其他节点保证数据一致因此是低可用性高一致性属于CP。 BASE理论 BASE理论是对CAP的一种解决思路包含三个思想 Basically Available 基本可用分布式系统在出现故障时允许损失部分可用性即保证核心可用。Soft State软状态 在一定时间内允许出现中间状态比如临时的不一致状态。Eventually Consistent最终一致性虽然无法保证强一致性但是在软状态结束后最终达到数据一致。 分布式事务最大的问题是各个子事务的一致性问题因此可以借鉴CAP定理和BASE理论有两种解决思路 AP模式各子事务分别执行和提交允许出现结果不一致然后采用弥补措施恢复数据即可实现最终一致。CP模式各个子事务执行后互相等待同时提交同时回滚达成强一致。但事务等待过程中处于弱可用状态。 不管是哪一种模式都需要在子系统事务之间互相通讯协调事务状态也就是需要一个事务协调者(TC) 这里的子系统事务称为分支事务有关联的各个分支事务在一起称为全局事务。 解决分布式事务的思想和模型 全局事务整个分布式事务分支事务分布式事务中包含的每个子系统的事务最终一致思想各分支事务分别执行并提交如果有不一致的情况再想办法恢复数据强一致思想歌分支事务执行完业务不要提交等待彼此结果而后统一提交或回滚 Seata Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务为用户打造一站式的分布式解决方案。 官网地址http://seata.io/其中的文档、播客中提供了大量的使用说明、源码分析。 Seata事务管理中有三个重要的角色 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态协调全局事务提交或回滚。TM (Transaction Manager) - 事务管理器 定义全局事务的范围、开始全局事务、提交或回滚全局事务。RM (Resource Manager) - 资源管理器 管理分支事务处理的资源与TC交谈以注册分支事务和报告分支事务的状态并驱动分支事务提交或回滚。 整体的架构如图 理解 TM是定义分布式事务范围的作用。类似于本地事务的begin…commit…rollback的作用。只不过其定义的是全局的分布式事务范围就需要知道有几个分布式分支的事务完成后才commit。TC是具体的协调和执行者。它监控每个分布式分支事务执行成功与否然后判断整体分布式事务是提交还是回滚。TM定义范围TC用于联络各分支与TM的范围推动总体分布式事务进程。RM是各分布式分支的监控器。监控各分支本地事务执行情况然后通知给TC同时驱动各分支本地事务的推进是提交还是回滚。 总体概括就是:TM是一个分布式事务的发起者和终结者TC负责维护分布式事务的运行状态而RM则负责本地事务的运行 Seata基于上述架构提供了四种不同的分布式事务解决方案(无论哪种方案都离不开TC也就是事务的协调者。) XA模式强一致性分阶段事务模式牺牲了一定的可用性无业务侵入TCC模式最终一致的分阶段事务模式有业务侵入AT模式最终一致的分阶段事务模式无业务侵入也是Seata的默认模式SAGA模式长事务模式有业务侵入 seata的部署 1.下载seata-server包地址在http/seata.io/zh-cn/blog/download.html 2.修改conf目录下的registry.conf文件 registry {# tc服务的注册中心类这里选择nacos也可以是eureka、zookeeper等type nacosnacos {# seata tc 服务注册到 nacos的服务名称可以自定义application seata-tc-serverserverAddr 127.0.0.1:8848group DEFAULT_GROUPnamespace cluster SHusername nacospassword nacos} }config {# 读取tc服务端的配置文件的方式这里是从nacos配置中心读取这样如果tc是集群可以共享配置type nacos# 配置nacos地址等信息nacos {serverAddr 127.0.0.1:8848namespace group SEATA_GROUPusername nacospassword nacosdataId seataServer.properties} }3.在nacos中添加seataServer.properties配置文件 配置内容如下 # 数据存储方式db代表数据库 store.modedb store.db.datasourcedruid store.db.dbTypemysql store.db.driverClassNamecom.mysql.cj.jdbc.Driver store.db.urljdbc:mysql://localhost:3306/seata-tc-server?useUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai store.db.userroot store.db.password12345678 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点击提交出现异常需要把#的注释都去掉空格换行也去掉 4.tc服务在管理分布式事务时需要记录事务相关数据到数据库中需要提前创建好表。 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;5.进入bin目录运行其中的seata-server.bat即可启动TC服务 启动成功后seata-server应该已经注册到nacos注册中心了。 seata的集成 1.在微服务中引入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 /dependency2.修改application.yml文件添加配置(配置TC服务信息通过注册中心nacos结合服务名称获取TC地址) seata:registry: # TC服务注册中心的配置微服务根据这些信息去注册中心获取tc服务地址# 参考tc服务自己的registry.conf中的配置type: nacos # 注册中心类型 nacosnacos: # tcserver-addr: 127.0.0.1:8848namespace: # namespace默认为空 group: DEFAULT_GROUP # 分组默认是DEFAULT_GROUPapplication: seata-tc-server # tc服务在nacos中的服务名称cluster: SHtx-service-group: seata-demo # 事务组根据这个获取tc服务的cluster名称service:vgroup-mapping: # 事务组与TC服务cluster的映射关系seata-demo: SH注册到Nacos中的微服务确定一个具体实例需要四个信息 namespace命名空间group分组application服务名cluster集群名 namespace为空就是默认的public 结合起来TC服务的信息就是publicDEFAULT_GROUPseata-tc-serverSH这样就能确定TC服务集群了。然后就可以去Nacos拉取对应的实例信息了。 事务模式 XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理DTPDistributed Transaction Processing标准XA 规范 描述了全局的TM与局部的RM之间的接口几乎所有主流的数据库(oracle,mysql)都对XA规范提供了支持实现的原理都是基于两阶段提交。 正常情况 异常情况 一阶段 事务协调者通知每个事物参与者执行本地事务本地事务执行完成后报告事务执行状态给事务协调者此时事务不提交继续持有数据库锁 二阶段 事务协调者基于一阶段的报告来判断下一步操作 如果一阶段都成功则通知所有事务参与者提交事务如果一阶段任意一个参与者失败则通知所有事务参与者回滚事务 Seata的XA模型 RM一阶段的工作 注册分支事务到TC执行分支业务sql但不提交报告执行状态到TC TC二阶段的工作 TC检测各分支事务执行状态 a.如果都成功通知所有RM提交事务 b.如果有失败通知所有RM回滚事务 RM二阶段的工作 接收TC指令提交或回滚事务 优缺点 XA模式的优点 事务的强一致性满足ACID原则。常用数据库都支持实现简单并且没有代码侵入 XA模式的缺点 因为一阶段需要锁定数据库资源等待二阶段结束才释放性能较差依赖关系型数据库实现事务 实现XA模式 Seata的starter已经完成了XA模式的自动装配实现非常简单步骤如下 1.修改application.yml文件每个参与事务的微服务开启XA模式 seata:data-source-proxy-mode: XA2.给发起全局事务的入口方法添加GlobalTransactional注解: OverrideGlobalTransactionalpublic Long create(Order order) {// 创建订单orderMapper.insert(order);try {// 扣用户余额accountClient.deduct(order.getUserId(), order.getMoney());// 扣库存storageClient.deduct(order.getCommodityCode(), order.getCount());} catch (FeignException e) {log.error(下单失败原因:{}, e.contentUTF8(), e);throw new RuntimeException(e.contentUTF8(), e);}return order.getId();}3.重启order-service再次测试发现无论怎样三个微服务都能成功回滚。 AT模式 AT模式同样是分阶段提交的事务模型不过缺弥补了XA模型中资源锁定周期过长的缺陷。 阶段一RM的工作 注册分支事务记录undo-log数据快照执行业务sql并提交报告事务状态 阶段二提交时RM的工作 删除undo-log即可 阶段二回滚时RM的工作 根据undo-log恢复数据到更新前 案例AT模式更新数据 1.一张表数据记录用户余额 idmoney1100 2.其中一个分支业务要执行sql update tb_account set money money - 10 where id 13.AT模式下当前分支事务执行流程如下 3.1一阶段 TM发起并注册全局事务到TCTM调用分支事务分支事务准备执行业务SQLRM拦截业务SQL根据where条件查询原始数据形成快照。 RM执行业务SQL提交本地事务释放数据库锁。此时 money 90RM报告本地事务状态给TC 3.2 阶段二 TM通知TC事务结束TC检查分支事务状态 如果都成功则立即删除快照如果有分支事务失败需要回滚。读取快照数据{id: 1, money: 100}将快照恢复到数据库。此时数据库再次恢复为100 脏写问题 在多线程并发访问AT模式的分布式事务时有可能出现脏写问题如图 解决思路就是引入了全局锁的概念。在释放DB锁之前先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据。 优缺点 AT模式的优点 一阶段完成直接提交事务释放数据库资源性能比较好利用全局锁实现读写隔离没有代码侵入框架自动完成回滚和提交 AT模式的缺点 两阶段之间属于软状态属于最终一致框架的快照功能会影响性能但比XA模式要好很多 AT模式与XA模式最大的区别是什么 XA模式一阶段不提交事务锁定资源AT模式一阶段直接提交不锁定资源。XA模式依赖数据库机制实现回滚AT模式利用数据快照实现数据回滚。XA模式强一致AT模式最终一致 实现AT模式 1.导入数据库 lock_table导入到TC服务关联的数据库 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 DEFAULT NULL,transaction_id bigint(20) DEFAULT NULL,branch_id bigint(20) NOT NULL,resource_id varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,table_name varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,pk varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,gmt_create datetime DEFAULT NULL,gmt_modified datetime DEFAULT NULL,PRIMARY KEY (row_key) USING BTREE,KEY idx_branch_id (branch_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATCOMPACT;undo_log表导入到微服务关联的数据库 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 KEY ux_undo_log (xid,branch_id) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATCOMPACT COMMENTAT transaction mode undo table;2.修改application.yml文件将事务模式修改为AT模式即可 seata:data-source-proxy-mode: AT # 默认就是AT3.重启服务并测试 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 Seata的TCC模型 事务悬挂和空回滚 当某分支事务的try阶段阻塞时可能导致全局事务超时而触发二阶段的cancel操作。在未执行try操作时先执行了cancel操作这时cancel不能做回滚就是空回滚。执行cancel操作时应当判断try是否已经执行如果尚未执行则应该空回滚。 对于已经空回滚的业务之前被阻塞的try操作恢复继续执行try就永远不可能confirm或cancel 事务一直处于中间状态这就是业务悬挂。执行try操作时应当判断cancel是否已经执行过了如果已经执行应当阻止空回滚后的try操作避免悬挂。 业务逻辑 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业务 实现TCC模式 1.1准备数据表 为了实现空回滚防止业务悬挂以及幂等性要求必须在数据库记录冻结金额的同时记录当前事务id和执行状态。 CREATE TABLE account_freeze_tbl (xid varchar(128) NOT NULL COMMENT 全局事务id,user_id varchar(255) DEFAULT NULL COMMENT 用户id,freeze_money int(11) unsigned DEFAULT 0 COMMENT 冻结金额,state int(1) DEFAULT NULL COMMENT 事务状态0:try1:confirm2:cancel,PRIMARY KEY (xid) USING BTREE ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATCOMPACT;1.2准备实体类 Data TableName(account_tbl) public class Account {TableIdprivate Long id;private String userId;private Integer money; }Data TableName(account_freeze_tbl) public class AccountFreeze {TableId(type IdType.INPUT)private String xid;private String userId;private Integer freezeMoney;private Integer state;public static abstract class State {public final static int TRY 0;public final static int CONFIRM 1;public final static int CANCEL 2;} }2.3准备mapper方法 public interface AccountMapper extends BaseMapperAccount {Update(update account_tbl set money money - ${money} where user_id #{userId})int deduct(Param(userId) String userId, Param(money) int money);Update(update account_tbl set money money ${money} where user_id #{userId})int refund(Param(userId) String userId, Param(money) int money); }2.声明TCC接口 LocalTCC//标记 public interface AccountTCCService {/**TwoPhaseBusinessAction表明该方法是try方法*name 方法名要与当前方法名一致用于指定try逻辑对应的方法*commitMethod 指定commit方法*rollbackMethod 指定rollback方法*BusinessActionContextParameter被标记的参数可以放入上下文对象里**/TwoPhaseBusinessAction(name deduct, commitMethod confirm, rollbackMethod cancel)void deduct(BusinessActionContextParameter(paramName userId) String userId,BusinessActionContextParameter(paramName money)int money);/***二阶段confirm确认方法可以另命名保证与commitMethod一致* context 上下文可以传递try方法的参数* return 执行是否成功**/boolean confirm(BusinessActionContext ctx);/*** 二阶段回滚方法保证与rollbackMethod一致*/boolean cancel(BusinessActionContext ctx); }3.实现TCC业务 Slf4j Service public class AccountTCCServiceImpl implements AccountTCCService {Autowiredprivate AccountMapper accountMapper;Autowiredprivate AccountFreezeMapper accountFreezeMapper;Overridepublic void deduct(String userId, int money) {//获取全局事务idString xid RootContext.getXID();//悬挂判断freeze中是否有冻结记录有一定是CANCEL执行过要拒绝业务AccountFreeze oldFree accountFreezeMapper.selectById(xid);if(oldFree ! null){return;}//1.扣减余额(数据库中默认0小于0会自动爆错不往下执行)accountMapper.deduct(userId,money);//2.冻结金额修改事务状态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) {//获取事务Id根据Id删除冻结金额String xid ctx.getXid();AccountFreeze accountFreeze accountFreezeMapper.selectById(xid);if(accountFreeze null){return true;}int count accountFreezeMapper.deleteById(xid);return count 1;}Overridepublic boolean cancel(BusinessActionContext ctx) {String xid ctx.getXid();//查询冻结金额,从数据库中根据事务Id查询AccountFreeze freeze accountFreezeMapper.selectById(xid);//1.空回滚判断判断freeze是否为null为null证明try没执行需要空回滚if(freeze null){//证明try没执行需要空回滚freeze new AccountFreeze();freeze.setUserId((String) ctx.getActionContext(userId));freeze.setFreezeMoney(0);freeze.setState(AccountFreeze.State.CANCEL);freeze.setXid(xid);accountFreezeMapper.insert(freeze);return true;}//2幂等判断if(AccountFreeze.State.CANCEL freeze.getState()){//已经处理过一次CANCLE了无需重复处理return true;}//恢复可用余额accountMapper.refund(freeze.getUserId(), freeze.getFreezeMoney());//将冻结金额清零状态改为cancelfreeze.setFreezeMoney(0);freeze.setState(AccountFreeze.State.CANCEL);int count accountFreezeMapper.updateById(freeze);return count1;} }优缺点 TCC的优点 一阶段完成直接提交事务释放数据库资源性能好相比AT模型无需生成快照无需使用全局锁性能最强不依赖数据库事务而是依赖补偿操作可以用于非事务型数据库 TCC的缺点 有代码侵入需要人为编写try、Confirm和Cancel接口太麻烦软状态事务是最终一致需要考虑Confirm和Cancel的失败情况做好幂等处理 SAGA模式 Saga 模式是 Seata 即将开源的长事务解决方案将由蚂蚁金服主要贡献。 Seata官网对于Saga的指南https://seata.io/zh-cn/docs/user/saga.html Saga也分为两个阶段 一阶段直接提交本地事务二阶段成功则什么都不做失败则通过编写补偿业务来回滚 因为一阶段没有资源预留所以二阶段不是操作冻结资源而是操作资源本身所以失去了资源冻结的隔离效果事务与事务之间会出现脏读。 优缺点 SAGA模式的优点 事务参与者可以基于事件驱动实现异步调用吞吐高一阶段直接提交事务无锁性能好不用编写TCC中的三个阶段实现简单 SAGA模式的缺点 软状态持续时间不确定时效性差没有锁没有事务隔离会有脏写 从以下几个方面来对比四种实现 一致性能否保证事务的一致性强一致还是最终一致隔离性事务之间的隔离性如何代码侵入是否需要对业务代码改造性能有无性能损耗场景常见的业务场景 高可用 Seata的TC服务作为分布式事务核心一定要保证集群的高可用性。搭建TC服务集群就是启动多个TC服务注册到nacos即可。但集群并不能确保100%安全万一集群所在机房故障怎么办所以如果要求较高一般都会做异地多机房容灾。 比如一个TC集群在上海另一个TC集群在杭州 微服务基于事务组tx-service-group)与TC集群的映射关系来查找当前应该使用哪个TC集群。当SH集群故障时只需要将vgroup-mapping中的映射关系改成HZ。则所有微服务就会切换到HZ的TC集群了。 TC服务的高可用和异地容灾 1.计划启动两台seata的tc服务节点 节点名称ip地址端口号集群名称seata127.0.0.18091SHseata2127.0.0.18092HZ 现在将seata目录复制一份起名为seata2修改seata2/conf/registry.conf内容如下 registry {# tc服务的注册中心类这里选择nacos也可以是eureka、zookeeper等type nacosnacos {# seata tc 服务注册到 nacos的服务名称可以自定义application seata-tc-serverserverAddr 127.0.0.1:8848group DEFAULT_GROUPnamespace cluster HZusername nacospassword nacos} }config {# 读取tc服务端的配置文件的方式这里是从nacos配置中心读取这样如果tc是集群可以共享配置type nacos# 配置nacos地址等信息nacos {serverAddr 127.0.0.1:8848namespace group SEATA_GROUPusername nacospassword nacosdataId seataServer.properties} }2.进入seata2/bin目录然后运行命令 seata-server.bat -p 80923.打开nacos控制台查看服务列表 点进详情查看 4.将事务组映射配置到nacos 配置的内容如下 # 事务组映射关系 service.vgroupMapping.seata-demoSHservice.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.exceptionRate1005.微服务读取nacos配置 需要修改每一个微服务的application.yml文件让微服务读取nacos中的client.properties文件 seata:config:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUPdata-id: client.properties6.重启微服务现在微服务到底是连接tc的SH集群还是tc的HZ集群都统一由nacos的client.properties来决定了。
http://www.hkea.cn/news/14415585/

相关文章:

  • 国外做的比较好的购物网站营销推广方案ppt案例
  • 寻找大连网站建设商城网站建设价格
  • 网站被**泛解析后的解决方法网站建设的参考文献
  • 中国风网站设计莱芜最新招工招聘启事
  • 电商法规定企业网站必须做3年前端开发师
  • 电商网站网络服务天津企业网站建设哪家好
  • 最简单的网站开发国际化自媒体制作视频教程
  • 谢岗镇网站仿做模板网站建设
  • 中国建设监理业协会网站wordpress内容分享微信
  • 哪个网站帮别人做ppt做的网站在ie会乱码
  • 做产品展示网站高大上的企业网站欣赏
  • 网站安全维护包括什么那个做图网站叫什么
  • 门户网站建设要点wordpress修改教程视频
  • 网站建设公司盈利分析用来做网页的软件
  • wordpress菜单调用图片建设网站优化
  • 让别人做网站多久开始注册域名我为群众办实事工作总结
  • 学校网站设计论文月夜影视在线观看免费完整版
  • 响应式网站建设外文文献商业网站建设案例笔记
  • 做6个页面的网站哈尔滨雕塑制作厂家
  • 考研门户网站的建设网站建设说明书模板
  • 企业在线购物网站建设vip视频网站怎么做
  • 找人做网站推广wordpress 首页访问量
  • vps打开网站很慢小红书推广方案
  • 网站建设首页包括什么软件强大的建筑人才网
  • 广州网站关键词排名商标免费生成器
  • 重庆手机网站推广资料python基础教程第三版
  • 织梦教育培训网站源码怎么用PS做网站广告图
  • 青岛网站建设公司在哪国外男女直接做的视频网站
  • 营业执照注册网站包装设计接单网站
  • 做的好的网站着陆页wpautop wordpress