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

苏州网站建设设计制作公司怎么样网线制作实训总结

苏州网站建设设计制作公司怎么样,网线制作实训总结,微信属于营销型网站,正常做一个网站多少钱Seata 是一款开源的分布式事务解决方案#xff0c;致力于提供高性能与简单易用的分布式事务服务#xff0c;为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来#xff0c;需要数据库支持。AT 模式的特点就是对业务无入侵式#xff0… Seata 是一款开源的分布式事务解决方案致力于提供高性能与简单易用的分布式事务服务为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来需要数据库支持。AT 模式的特点就是对业务无入侵式用户只需要关注自己的业务SQLSeata 框架会在第一阶段拦截并解析用户的 SQL并保存其变更前后的数据镜像形成undo log并自动生成事务第二阶段的提交和回滚操作。 一、Seata 介绍 1、Seata 简介 Seata 是一款开源的分布式事务解决方案致力于提供高性能与简单易用的分布式事务服务为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式 AT模式无侵入式的分布式事务解决方案适合不希望对业务进行改造的场景但由于需要添加全局事务锁对影响高并发系统的性能。该模式主要关注多DB访问的数据一致性也包括多服务下的多DB数据访问一致性问题TCC模式高性能的分布式事务解决方案适用于对性能要求比较高的场景。该模式主要关注业务拆分在按照业务横向扩展资源时解决服务间调用的一致性问题Saga模式长事务的分布式事务解决方案适用于业务流程长且需要保证事务最终一致性的业务系统。Saga 模式一阶段就会提交本地事务无锁长流程情况下可以保证性能多用于渠道层、集成层业务系统事务参与者可以是其它公司的服务也可以是遗留系统的服务并且对于无法进行改造和提供 TCC 要求的接口也可以使用 Saga 模式 2、Seata 的核心组件 在 Seata 中主要有以下三种角色其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起TC 作为 Seata 的服务端独立部署 事务协调器TC维护全局事务的运行状态负责协调并驱动全局提交或回滚事务管理器TM事务发起方控制全局事务的范围负责开启一个全局事务并最终发起全局提交或回滚全局的决议资源管理器RM事务参与方管理本地事务正在处理的资源负责向 TC 注册本地事务、汇报本地事务状态接收 TC 的命令来驱动本地事务的提交或回滚 3、Seata 的整体执行流程 Seata 分布式事务的整体执行机制如上图所示可以大致分为两阶段提交 ① 发起方 TM 向 TC 申请开启一个全局事务全局事务创建成功并生成唯一的全局事务标识 XID该 XID 在后续事务的服务调用链路的上下文传播通过Aop实现)② RM 向 TC 注册分支事务汇报资源准备状况并与 XID 进行绑定Branch分支事务指分布式事务中每个独立的本地局部事务③ TM 向 TC 发起 XID 下的所有分支事务的全局提交或回滚请求事务一阶段结束④ TC 汇总事务信息决定分布式事务是提交还是回滚⑤ TC 通知所有 RM 提交/回滚 资源事务二阶段结束 二、Seata 的 AT 模式原理 Seata AT模式是基于XA事务XA是基于数据库实现的分布式事务协议演进而来需要数据库支持如果是 MySQL则需要5.6以上版本才支持XA协议。AT 模式的特点就是对业务无入侵式用户只需要关注自己的业务SQLSeata 框架会在第一阶段拦截并解析用户的 SQL并保存其变更前后的数据镜像形成undo log并自动生成事务第二阶段的提交和回滚操作。 1、AT 模式的整体执行流程 AT 模式 RM 驱动分支事务的行为分为以下两个阶段 1执行阶段 1代理 JDBC 数据源拦截并解析业务 SQL生成更新前后的镜像数据形成 UNDO LOG。2向 TC 注册分支。3分支注册成功后把业务数据的更新和 UNDO LOG 放在同一个本地事务中提交。 2完成阶段 全局提交收到 TC 的分支提交请求异步删除相应分支的 UNDO LOG。全局回滚收到 TC 的分支回滚请求查询分支对应的 UNDO LOG 记录生成补偿回滚的 SQL 语句执行分支回滚并返回结果给 TC 2、AT 模式两阶段详细流程 2.1、第一阶段的详细执行流程 在第一阶段RM 写表时Seata 通过代理数据源从而达到对业务无侵入的效果拦截业务 SQL 并 解析 SQL 语义找到该 SQL 要更新的业务数据保存成 before image前置镜像然后执行业务SQL在业务数据更新后再将其保存成 after image后置镜像最后生成行锁。通过把更新前后的业务数据数据镜像组织成回滚日志 undo log并利用本地事务的 ACID 特性将业务数据的更新和回滚日志 undo log 的写入在同一个本地事务中提交保证任何提交的业务数据的更新一定有相应的回滚日志存在即操作的原子性。 基于这样的机制分支的本地事务就可以在全局事务的第一阶段提交并马上释放本地事务锁定的资源这也是 Seata 的 AT 模式和 XA 事务的不同之处两阶段提交往往对资源的锁定需要持续到第二阶段实际的提交或者回滚操作而有了回滚日志之后可以在第一阶段释放对资源的锁定降低了锁范围提高效率即使第二阶段发生异常需要回滚只需找对 undo log 中对应数据镜像并反解析成 SQL 来达到回滚目的 2.2、第二阶段提交的详细执行流程 如果二阶段的全局表决结果是提交的话说明所有分支事务的业务SQL已经在第一阶段生效此时 Seata 框架只需异步删除所有分支第一阶段保存的镜像数据、回滚日志和行锁完成数据清理即可这个过程是非常快速的 2.3、第二阶段回滚的详细执行流程### [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ivfSy7U-1681028816230)(https://image.xiaoxiaofeng.site/spider/2023/3/23/xxf-1679550460070.png)] 如果第二阶段是回滚的话Seata 就需要回滚第一阶段已执行的 SQL 进行还原业务数据。由 TC 通知所有 RM 进行根据第一阶段的回滚日志 undo log 即before image进行反向补偿RM 收到 TC 发来的回滚请求后通过 XID 和 Branch ID 找到相应的回滚日志记录通过undo log 生成反向的更新 SQL 并执行以完成分支的业务数据还原最后删除 undo log、redo log 和行锁。但在还原前需要校验脏写对比数据库”当前业务数据”和 “after image”如果两份数据完全一致就说明没有脏写可以还原业务数据如果不一致就说明有脏写出现脏写就需要转人工处理。 三、Seata 的 TCC、Saga、XA模式原理 文章第二部分介绍了 Seata 的 AT 模式接下来我们就介绍下 Seata 的其实几种事务模式 1、TCC 模式 TCC 模式 RM 驱动分支事务的行为分为以下两个阶段 1执行阶段 ① 向 TC 注册分支。② 执行业务定义的 Try 方法。③ 向 TC 上报 Try 方法执行情况成功或失败。 2完成阶段 全局提交收到 TC 的分支提交请求执行业务定义的 Confirm 方法。全局回滚收到 TC 的分支回滚请求执行业务定义的 Cancel 方法。 2、Saga 模式 Saga 模式 RM 驱动分支事务的行为包含以下两个阶段 1执行阶段 ① 向 TC 注册分支。② 执行业务方法。③ 向 TC 上报业务方法执行情况成功或失败。 2完成阶段 全局提交RM 不需要处理。全局回滚收到 TC 的分支回滚请求执行业务定义的补偿回滚方法。 3、XA模式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9aMm9I8-1681028816232)(https://image.xiaoxiaofeng.site/spider/2023/3/23/xxf-1679550461309.png)] XA 模式 RM 驱动分支事务的行为包含以下两个阶段 1执行阶段 ① 向 TC 注册分支② XA Start执行业务 SQLXA End③ XA prepare并向 TC 上报 XA 分支的执行情况成功或失败 2完成阶段 收到 TC 的分支提交请求XA Commit收到 TC 的分支回滚请求XA Rollback 参考文章 https://help.aliyun.com/document_detail/157850.html https://blog.csdn.net/k6T9Q8XKs6iIkZPPIFq/article/details/107273472 四、SpringCloud Alibaba 整合 Seata AT 模式 1、搭建 Seata TC 协调者 1.1、下载 Seata TC 协调者 Seata 的协调者其实就是阿里开源的一个服务我们只需要下载下载地址[https://github.com/seata/seata/releases][https_github.com_seata_seata_releases]并启动它下载完成后直接解压即可但是此时还不能直接运行还需要做一些配置 1.2、创建TC所需要的表 [https://github.com/seata/seata/tree/1.4.2/script/server/db][https_github.com_seata_seata_tree_1.4.2_script_server_db] TC 运行需要将事务信息保存在数据库因此需要创建一些表找到 seata-1.4.2 源码的 script\server\db 这个目录将会看到以下SQL文件 以 MySQL 数据库为例创建数据库 seata并执行 mysql.sql 文件中的sql语句 CREATE TABLE IF NOT EXISTS global_table (xid VARCHAR(128) NOT NULL,transaction_id BIGINT,status TINYINT NOT 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_gmt_modified_status (gmt_modified, status),KEY idx_transaction_id (transaction_id) ) ENGINE InnoDBDEFAULT CHARSET utf8;-- the table to store BranchSession data CREATE TABLE IF NOT EXISTS branch_table (branch_id BIGINT NOT 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 utf8;-- the table to store lock data CREATE TABLE IF NOT EXISTS lock_table (row_key VARCHAR(128) NOT NULL,xid VARCHAR(128),transaction_id BIGINT,branch_id BIGINT NOT NULL,resource_id VARCHAR(256),table_name VARCHAR(32),pk VARCHAR(36),gmt_create DATETIME,gmt_modified DATETIME,PRIMARY KEY (row_key),KEY idx_branch_id (branch_id) ) ENGINE InnoDBDEFAULT CHARSET utf8;创建的三张表如下图 global_table全局事务表每当有一个全局事务发起后就会在该表中记录全局事务的IDbranch_table分支事务表记录每一个分支事务的ID分支事务操作的哪个数据库等信息lock_table全局锁 1.3、修改TC的注册中心和配置中心 找到 seata-server-1.4.2\seata\conf 目录其中有一个 registry.conf 文件其中配置了TC的注册中心和配置中心。默认的注册中心是 file 形式实际使用中肯定不能使用需要改成Nacos形式同样 Seate 的 TC 的配置中心默认也是使用 file 形式需要修改为 nacos 作为配置中心 registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype nacosnacos {application seata-serverserverAddr localhost:8848namespace XXXXXXXXXXcluster defaultusername nacospassword nacos} }config {# file、nacos 、apollo、zk、consul、etcd3type nacosnacos {serverAddr localhost:8848namespace XXXXXXXXXXgroup SEATA_GROUPusername nacospassword nacos} }需要改动的地方如下 type改成nacos表示使用nacos作为注册中心或者配置中心application服务的名称serverAddrnacos的地址group分组namespace命名空间username用户名password密码 上述配置修改好之后在TC启动的时候将会自动读取 nacos 的配置最后这份 registry.conf 文件的配置需要与下文每个seata客户端项目中的配置一致 1.4、导入 seata Server 配置 建议将 seata 项目下载到本地并阅读 [https://github.com/seata/seata/tree/1.4.2/script/config-center][https_github.com_seata_seata_tree_1.4.2_script_config-center] 路径下的README.md内容 在上面我们已经配置好 seata TC 的配置中心那么 TC 需要存储到 Nacos 的配置都有哪些如何推送过去呢在 [https://github.com/seata/seata/tree/1.4.2/script/config-center][https_github.com_seata_seata_tree_1.4.2_script_config-center] 中有一个 confIg.txt 文件其中就是 TC 需要的全部配置而 [https://github.com/seata/seata/tree/1.4.2/script/config-center/nacos][https_github.com_seata_seata_tree_1.4.2_script_config-center_nacos] 中有一个 nacos-config.sh 脚本能够将 config.txt 中的全部配置自动推送到nacos中。 我们先启动nacos服务然后在 nacos-config.sh 目录下执行下面命令将 config.txt 中的配置信息推送到 nacos 中 # -h 代表nacos服务的IP-p 代表nacos的端口号-g 分组信息-t 命名空间ID-u 用户名-p 密码 $ sh nacos-config.sh -h 127.0.0.1 -p 8080 -g SEATA_GROUP -t 7a7581ef-433d-46f3-93f9-5fdc18239c65 -u nacos -w nacos 命令执行成功后就可以在nacos中看到如下配置 1.5、修改TC的事务信息存储方式 seata 的 TC 端的事务信息存储模式store.mode现有file、db、redis三种file模式无需改动直接启动即可下面专门讲下db和redis启动步骤。 注 file模式为单机模式全局事务会话信息内存中读写并持久化本地文件root.data性能较高 1以DB模式存储 db模式为高可用模式全局事务会话信息通过db共享相应性能差些上一节的内容已经将所有的配置信息都推送到了Nacos中TC启动时会从Nacos中读取因此我们修改也需要在Nacos中修改。需要修改的配置如下 ## 采用db的存储形式 store.modedb ## druid数据源 store.db.datasourcedruid ## mysql数据库 store.db.dbTypemysql ## mysql驱动 store.db.driverClassNamecom.mysql.jdbc.Driver ## TC的数据库url store.db.urljdbc:mysql://127.0.0.1:3306/seata_server?useUnicodetrue ## 用户名 store.db.userroot ## 密码 store.db.passwordNov2014在nacos中搜索上述的配置直接修改其中的值比如修改 store.mode如下图 2以Redis模式存储 redis模式 Seata-Server 1.3 及以上版本支持性能较高但存在事务信息丢失风险所以需要提前配置合适当前场景的redis持久化配置该模式需改动以下配置 store.moderedis store.redis.host127.0.0.1 store.redis.port6379 store.redis.password1234561.6、启动TC 按照上述步骤全部配置成功后则可以启动TC在 seata-server-1.4.2\bin 目录下直接点击 seata-server.batwindows运行启动成功后启动成功后在Nacos的服务列表中则可以看到TC已经注册进入如下图 至此Seata 的 TC 就启动完成了… 2、搭建Seata 客户端RM 2.1、maven 添加 seata 依赖 dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId!-- 排除依赖指定版本和服务端一致 --exclusionsexclusiongroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactId/exclusionexclusiongroupIdio.seata/groupIdartifactIdseata-all/artifactId/exclusion/exclusions /dependency dependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion1.4.2/version /dependency dependencygroupIdio.seata/groupIdartifactIdseata-all/artifactIdversion1.4.2/version /dependency注意seata客户端的依赖版本必须要和服务端一致。 2.2、application.yml 添加 seate 配置 seata:# 这里要特别注意和nacos中配置的要保持一致建议配置成 ${spring.application.name}-tx-grouptx-service-group: my_test_tx_groupregistry:type: nacosnacos:# 配置所在命名空间ID如未配置默认public空间server-addr: 127.0.0.1:8848namespace: XXXXXXXXXXgroup: SEATA_GROUPapplication: seata-serveruserName: nacospassword: nacosconfig:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: XXXXXXXXXXgroup: SEATA_GROUPuserName: nacospassword: nacostx-service-group 配置的值可以自定义但是定义后需要在 nacos 配置中心新增 service.vgroupMapping.xxxdefault 的配置该属性一定一定要和 seata 服务端的配置一致否则不生效比如上述配置中的就需要在 nacos 配置中心新增一个配置项 service.vgroupMapping.my_test-tx-groupdefault并且设置分组为SEATA_GROUP如下图 注意my_test-tx-group 仅仅是后缀在nacos中添加配置时记得要加上前缀 service.vgroupMapping. 2.3、数据库中添加回滚日志表 [https://github.com/seata/seata/tree/1.4.2/script/client/at/db][https_github.com_seata_seata_tree_1.4.2_script_client_at_db] 回滚日志表undo_log这是Seata要求必须有的每个业务库都应该创建一个SQL如下 CREATE TABLE IF NOT EXISTS undo_log (branch_id BIGINT NOT NULL COMMENT branch transaction id,xid VARCHAR(128) NOT NULL COMMENT global transaction id,context VARCHAR(128) 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) ) ENGINE InnoDBAUTO_INCREMENT 1DEFAULT CHARSET utf8 COMMENT AT transaction mode undo table;2.4、使用 seata 作为全局事务控制 在分布式业务入口增加全局事务注解 GlobalTransactional其他 service 接口无需配置假设A服务调用B服务那么就在A服务的方法上面加入B服务上面不用加 /*** seata 的 GlobalTransactional 注解只需要加载分布式业务入口处其他service接口无需配置从而实现分布式事务*/GlobalTransactionalPostMapping (value addOrder,produces {application/json;charsetutf-8})public String addOrder(RequestParam String title, RequestParam int price, RequestParam int shopId, RequestParam int userId){shopOrderService.save(ShopOrderPojo.builder().price(price).title(title).shopId(shopId).userId(userId).build());storageFeignService.reduceStorage(shopId, 1);return success;}备注如果你进行异常捕捉seata 将认为你已进行异常处理就不会回滚数据了 1比如如果你配置了ControllerAdvice将可能导致数据不回滚 2如果使用 Feign 调用分布式服务并配置了fallback后面服务抛出异常会直接执行fallback导致无法回滚(rollbackFor Exception.class)这时可以在fallback的实现方法内手动调用seata全局回滚如下所示 Overridepublic BizResponse insertAge(Integer age) {//feign调用接口fallback后需要手动调用全局事务回滚try {String xid RootContext.getXID();GlobalTransactionContext.reload(xid).rollback();} catch (TransactionException e) {e.printStackTrace();}return BizResponse.fail(客户端降级处理insertAge Thread.currentThread().getName()); }2.5、undo log 表介绍 上面介绍过 Seata 是根据 undo_log 中的记录来回滚的但是异常回滚后 undo_log 表却为空怎么回事这是因为 undo_log 日志被删除了想要看到undo_log 表中记录我们需要打断点来看在异常还没抛出时打断点然后看下数据库 undo_log 表中数据情况。 参考文章 [Seata 官方文档https://seata.io/zh-cn/docs/overview/what-is-seata.html][Seata _https_seata.io_zh-cn_docs_overview_what-is-seata.html]
http://www.hkea.cn/news/14394872/

相关文章:

  • 宁波网站开发制作魔方网站建设网站制作
  • asp网站手机模版广州口碑好的网站建设定制
  • 怎么创建网站校园表白墙健康东莞app
  • 南京外贸网站建设案例商务网站建设软件
  • 萍乡做网站的公司wordpress文字环绕广告
  • 凡科网站免费注册wordpress贴吧
  • 镇江网站关键词优化预订现代简约装修三室两厅两卫样
  • 网站找图片做海报侵权营销策划公司行业榜单
  • 惠州网吧标题优化
  • 自己的电脑做服务器搭建网站陕麻圈辅助软件
  • 有后台的网站如何建设柳州企业网站建设
  • 电子商务网站建设与维护 书做优惠券网站要多少钱
  • 网站建设的目的模板驻马店 市网站建设
  • 建设网站教程视频公司总经理培训推广哪家好
  • 购物网站建设精英网站建设付款方式
  • 中国建设银行官网站e路护航重庆网站推广优化
  • 江苏建设工程造价管理网站企业宣传片拍摄制作
  • 网站首页布局seo策划公司活动方案
  • 怎样把自己的网站推广出去提高销售的10种方法
  • 肉山谷英雄传说新手任务登录英文网站怎么做老牛影视传媒有限公司
  • 国内站长做国外网站现在如何给网站做外链
  • 做网站选哪家公司没固定ip怎么做网站
  • 宣传网站怎么做的设计网站建设书南昌
  • 网站注册域名位置网站设计风格的关键词
  • 外国做的福利小视频在线观看网站广告拍摄制作公司
  • 辽宁网站建设企业织梦模板首页修改教程
  • 网站数据采集怎么做池州网站建设电话
  • seo站长教程筑业网
  • 手机网站设计创意说明设计常用网站
  • 网站如何做修改密码的相关验证开发一款彩票app需要多少钱