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

青岛网站设计机构o2o网站建设哪家好

青岛网站设计机构,o2o网站建设哪家好,手机制作动画的app,企业网站搜索引擎拓客目录 一、Seata 1、Seata-AT模式 1.1、具体案例 1.2、通过Seata的AT模式解决分布式事务 2、Seata-XA模式 3、Seata-TCC模式 4、Seata-SAGA模式 一、Seata 1、Seata-AT模式 概念#xff1a;AT模式是一种无侵入的分布式事务解决方案#xff0c;在 AT 模式下#xff0c…目录 一、Seata 1、Seata-AT模式 1.1、具体案例 1.2、通过Seata的AT模式解决分布式事务 2、Seata-XA模式 3、Seata-TCC模式 4、Seata-SAGA模式 一、Seata 1、Seata-AT模式 概念AT模式是一种无侵入的分布式事务解决方案在 AT 模式下用户只需关注自己的“业务 SQL”用户的 “业务 SQL” 作为一阶段Seata 框架会自动生成事务的二阶段提交和回滚操作。Seata AT 模式 两阶段提交协议的演变一阶段业务数据和回滚日志记录在同一个本地事务中提交释放本地锁和连接资源。二阶段提交异步化非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。         在一阶段中Seata会拦截“业务SQL“首先解析SQL语义找到要更新的业务数据在数据被更新前保存下来undo然后执行”业务SQL“更新数据更新之后再次保存数据”redo“最后生成行锁这些操作都在本地数据库事务内完成这样保证了一阶段的原子性。 二阶段         相对一阶段二阶段比较简单负责整体的回滚和提交如果之前的一阶段中有本地事务没有通过那么就执行全局回滚否在执行全局提交回滚用到的就是一阶段记录的undo Log通过回滚记录生成反向更新SQL并执行以完成分支的回滚。当然事务完成后会释放所有资源和删除所有日志。 1.1、具体案例 1、创建两个服务一个订单order8801 一个库存stock8802 创建数据库表 -- stock库存表 DROP TABLE IF EXISTS t_stock; CREATE TABLE t_stock (product_id int(11) NOT NULL AUTO_INCREMENT,money int(11) DEFAULT 0,count int(11) DEFAULT 0,PRIMARY KEY (product_id) ) ENGINEInnoDB DEFAULT CHARSETutf8;insert into t_stock (product_id,count,money) values (1,100,10);-- order订单表 DROP TABLE IF EXISTS t_order; CREATE TABLE t_order (product_id int(11) NOT NULL AUTO_INCREMENT,count int(11) DEFAULT 0,PRIMARY KEY (product_id) ) ENGINEInnoDB DEFAULT CHARSETutf8; 业务订单服务通过OpenFegin远程调用库存服务然后库存服务减库存订单服务生成订单完成基本的调用以后我们给订单服务添加异常 pom dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId/dependencydependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactId/dependency/dependencies yml server:port: 8801spring:application:name: seata-ordercloud:nacos:discovery:server-addr: localhost:8848namespace: b98dfc17-7de8-44f1-b1e1-837fe681b96cgroup: SEATA_GROUPdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/seata_test?characterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghairewriteBatchedStatementstrueusername: rootpassword: rootseata:tx-service-group: mygroupservice:vgroup-mapping:mygroup: defaultregistry:type: nacosnacos:server-addr: localhost:8848group: SEATA_GROUPnamespace: b98dfc17-7de8-44f1-b1e1-837fe681b96cusername: nacospassword: nacos 补充对应关系stock8802如下端口和服务名不同其他同上server:port: 8802spring:application:name: seata-stock 订单order8801 启动类 EnableDiscoveryClient EnableFeignClients MapperScan(com.lwz.springcloud.mapper) SpringBootApplication public class Order8801Main {public static void main(String[] args) {SpringApplication.run(Order8801Main.class,args);}} 控制层 RestController public class OrderController {Autowiredprivate OrderService orderService;GetMapping(/order/create)public String create(){orderService.create();return 生成订单;} } service public interface OrderService {void create(); } serviceimpl Service public class OrderServiceImpl implements OrderService {Resourceprivate OrderMapper orderMapper;Resourceprivate StockService stockService;Overridepublic void create() {// 减库存stockService.decrement();// 添加异常int i 1/0;// 创建订单orderMapper.create();} } mapper public interface OrderMapper {Insert(insert into t_order (count) values (1))void create(); } feign FeignClient(value seata-stock) public interface StockService {GetMapping(/stock/decr)String decrement(); } 库存stock8802 启动类 SpringBootApplication MapperScan(com.lwz.springcloud.mapper) EnableDiscoveryClient public class Stock8802Main {public static void main(String[] args) {SpringApplication.run(Stock8802Main.class,args);} } 控制层 RestController public class StockController {Resourceprivate StockService stockService;GetMapping(/stock/decr)public String decrement(){stockService.decr();return 库存-1;}} service public interface StockService {void decr(); } serviceimpl Service public class StockServiceImpl implements StockService {Resourceprivate StockMapper stockMapper;Overridepublic void decr() {stockMapper.decr();} } mapper public interface StockMapper {Update(update t_stock set count count - 1 where product_id 1)void decr(); }Nacos和Seata都要进行启动8801和8802起来 访问Order的接口测试http://localhost:8801/order/create 此时我们会发现访问接口出现异常情况但是库存减少订单没有增加此时已经出现了分布式事务的问题 库存数量减一但是订单表没数据 1.2、通过Seata的AT模式解决分布式事务 Seata依赖上面已经添加过 dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId /dependency 在对应的微服务数据库上加上undo_log表此表用于数据的回滚 undo_log表去官网上找或源代码seata/script/client/at/db/mysql.sql下面找到AT需要的undo_log表 -- for AT mode you must to init this sql for you business database. the seata server not need it. 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 InnoDB AUTO_INCREMENT 1 DEFAULT CHARSET utf8mb4 COMMENT AT transaction mode undo table; ALTER TABLE undo_log ADD INDEX ix_log_created (log_created); 需要在order8801(TM)的Controller上添加注解 RestController public class OrderController {Autowiredprivate OrderService orderService;GetMapping(/order/create)GlobalTransactional// 开启分布式事务public String create(){orderService.create();return 生成订单;} } 把t_stock表删除再把最上面的SQL语句重新执行一次重启服务进行测试。 Nacos和Seata都要进行启动8801和8802起来 访问Order的接口测试http://localhost:8801/order/create 访问接口仍然会报异常但是此时已经解决了分布式事务问题。 库存没有减少订单也没有增加 那么为了验证undo_log表用于存储回滚的数据我们在OrderServiceImpl上异常位置添加断点同时以debug方式来启动8801订单服务。 然后访问接口http://localhost:8801/order/create程序会卡在断点上此时我们来查看undo_log表和库存表此时我们会发现库存确实减少了但是在undo_log表中出现了快照记录了当前修改前的数据这个数据就是用于回滚的数据 undo_log表记录快照 库存减少 放行以后库存数量回复回滚生效 2、Seata-XA模式 Seata XA 什么是XA XA 规范早在上世纪 90 年代初就被提出用以解决分布式事务处理这个领域的问题。 注意不存在某一种分布式事务机制可以完美适应所有场景满足所有需求。 现在无论 AT 模式、TCC 模式还是 Saga 模式这些模式的提出本质上都源自 XA 规范对某些场景需求的无法满足。 什么是XA协议? XA 规范 是 X/Open 组织定义的分布式事务处理DTPDistributed Transaction Processing标准 XA 规范 描述了全局的事务管理器与局部的资源管理器之间的接口。 XA规范 的目的是允许的多个资源如数据库应用服务器消息队列等在同一事务中访问这样可以使 ACID 属性跨越应用程序而保持有效。 XA 规范 使用两阶段提交2PCTwo-Phase Commit来保证所有资源同时提交或回滚任何特定的事务。 XA 规范 在上世纪 90 年代初就被提出。目前几乎所有主流的数据库都对 XA 规范 提供了支持。 DTP模型定义如下角色 - AP即应用程序可以理解为使用DTP分布式事务的程序 - RM资源管理器可以理解为事务的参与者一般情况下是指一个数据库的实例MySql通过资源管理器对该数据库进行控制资源管理器控制着分支事务 - TM事务管理器负责协调和管理事务事务管理器控制着全局事务管理实务生命周期并协调各个RM。全局事务是指分布式事务处理环境中需要操作多个数据库共同完成一个工作这个工作即是一个全局事务。 - DTP模式定义TM和RM之间通讯的接口规范叫XA简单理解为数据库提供的2PC接口协议基于数据库的XA协议来实现的2PC又称为XA方案。 3、Seata-TCC模式 TCC 是分布式事务中的二阶段提交协议它的全称为 Try-Confirm-Cancel即资源预留Try、确认操作Confirm、取消操作Cancel他们的具体含义如下 1. Try对业务资源的检查并预留 2. Confirm对业务处理进行提交即 commit 操作只要 Try 成功那么该步骤一定成功 3. Cancel对业务处理进行取消即回滚操作该步骤回对 Try 预留的资源进行释放。         TCC 是一种侵入式的分布式事务解决方案以上三个操作都需要业务系统自行实现对业务系统有着非常大的入侵性设计相对复杂但优点是 TCC 完全不依赖数据库能够实现跨数据库、跨应用资源管理对这些不同数据访问通过侵入式的编码方式实现一个原子操作更好地解决了在各种复杂业务场景下的分布式事务问题。 TCC和AT区别 AT 模式基于支持本地ACID事务的关系型数据库 一阶段 prepare 行为在本地事务中一并提交业务数据更新和相应回滚日志记录。 二阶段 commit 行为马上成功结束自动异步批量清理回滚日志。 二阶段 rollback 行为通过回滚日志自动 生成补偿操作完成数据回滚。 相应的TCC 模式不依赖于底层数据资源的事务支持 一阶段 prepare 行为调用 自定义的 prepare 逻辑。 二阶段 commit 行为调用 自定义的 commit 逻辑。 二阶段 rollback 行为调用 自定义的 rollback 逻辑。 所谓 TCC 模式是指支持把 自定义的分支事务纳入到全局事务的管理中。 特点 1. 侵入性比较强并且需要自己实现相关事务控制逻辑 2. 在整个过程基本没有锁性能较强 TCC具体案例 4、Seata-SAGA模式 Saga模式是SEATA提供的长事务解决方案在Saga模式中业务流程中每个参与者都提交本地事务当出现某一个参与者失败则补偿前面已经成功的参与者一阶段正向服务和二阶段补偿服务执行处理时候出错了给一个修复的机会都由业务开发实现。 Seata saga模式 Saga 模式下分布式事务通常是由事件驱动的各个参与者之间是异步执行的Saga 模式是一种长事务解决方案。 Spring Cloud Alibaba Seata(一) 怕输的人永远没有资格赢
http://www.w-s-a.com/news/307642/

相关文章:

  • 福田区住房和建设局网站好搜搜索引擎
  • 平面设计师看的网站济南机场建设
  • 俄文网站开发翻译平台页面设计模板
  • 建设在线购物网站淮南电商网站建设价格
  • 龙泉市旅游门户网站建设wordpress faq插件
  • 网站的流程图贵阳做网站方舟网络
  • c 做网站开发实例wordpress 加上index
  • 济南seo网站推广搜索广告推广
  • 有关于网站建设的参考文献宁波seo网络推广公司
  • 网站设配色个人主页介绍文案
  • 网站seo相关设置优化网站建设的好处
  • 上海市建设工程安全生产协会网站郴州网站设计公司
  • 网站大型网页游戏自己搭建服务器做视频网站
  • 建立网站企业wordpress用户名密码破解
  • 网站管理助手建站教程国外网站做acm题目比较好
  • 网站开发框架排行专业网页制作服务商
  • 企业网站建设入账政务网站建设信息
  • 网络平台建设是什么江门排名优化怎么做
  • 响应式旅游网站模板下载网址做
  • 个人做网站名称可以随意更改吗惠州网站推广排名
  • 自己建设一个网站步骤网站认证怎么认证
  • 深圳建站公司开发费用沧州手机建站哪家好
  • 兰州网站设计公司排名百度怎么发布短视频
  • 大连模板开发建站泰州网站建设策划方案
  • 厦门好的网站设计局域网内建网站
  • 关键词那种网站正版网页游戏平台排行榜
  • 网站自助建设平台创建网址快捷方式
  • 坑梓网站建设包括哪些成都网站建设优创
  • 重庆网站seo公司哪家好超级优化大师
  • 成都网站建设推广详情邵阳市住房和城乡建设局网站