三天学会阿里分布式事务框架Seata-应用seata AT模式方案解决分布式事务问题

本文主要是介绍三天学会阿里分布式事务框架Seata-应用seata AT模式方案解决分布式事务问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

锋哥原创的分布式事务框架Seata视频教程:

实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)_哔哩哔哩_bilibili实战阿里分布式事务框架Seata视频教程(无废话,通俗易懂版)共计10条视频,包括:1 阿里分布式事务框架Seata简介、2 分布式事务简介、3 SpringCloud Alibaba分布式基础案例搭建等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Uf4y1579F/seata主推的是AT模式强一致性解决方案,所以我们采用这个方案来解决前面案例的分布式问题。

7.1 下载和运行seata server

seata server地址:Releases · apache/incubator-seata · GitHub

最新版本 v1.4.2

我们用windows演示,下载seata-server-1.4.2.zip

seata-server配置文件:

seata server所有的配置都在conf文件夹内,该文件夹内有两个文件我们必须要详细介绍下。 seata server默认使用file(文件方式)进行存储事务日志、事务运行信息,我们可以通过-m db脚本参数的形式来指定,目前仅支持file、db这两种方式。

file.conf

该文件用于配置存储方式、透传事务信息的NIO等信息,默认对应registry.conf文件内的file方式配置。

registry.conf

seata server核心配置文件,可以通过该文件配置服务注册方式、配置读取方式。

注册方式目前支持file 、nacos 、eureka、redis、zk、consul、etcd3、sofa等方式,默认为file,对应读取file.conf内的注册方式信息。

读取配置信息的方式支持file、nacos 、apollo、zk、consul、etcd3等方式,默认为file,对应读取file.conf文件内的配置。

file.conf我们加一个service配置:

service {#vgroup->rgroup 服务分组  集群分组默认为"default"vgroupMapping.my_test_tx_group = "default"#only support single nodedefault.grouplist = "127.0.0.1:8091"#degrade current not support 服务降级达到多次错误不走seataenableDegrade = false#disabledisable = false#unit ms,s,m,h,d represents milliseconds, seconds, minutes, hours, days, default permanentmax.commit.retry.timeout = "-1"max.rollback.retry.timeout = "-1"
}

这里事务分组概念,我们最后单独讲,主要是为了集群故障的时候,能快速切换,实现高可用;

配置分组映射,集群分组再配置grouplist,暴露server地址,提供给seata-client调用;

最后我们运行bin目录下的seata-server.bat启动seata-server:

启动OK,监听端口8091

7.2 每个数据库都建一个undo_log回滚日志表

根据seata AT模式规范,我们新建undo_log表,db_account和db_order都要建;

CREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

7.3 项目里添加seata-client maven依赖

我们只需要在seata-common公共模块项目里添加seata依赖,其他子模块都有了,方便;

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

7.4 项目里配置seata分布式事务

首先是每个项目都要配置seata支持,请求seata-server,根据配置;

再通过@GlobalTransactional注解,开启全局分布式事务;

seata-order子项目 application.yml配置改下:

server:port: 8081servlet:context-path: /spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_order?serverTimezone=Asia/Shanghaiusername: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group: my_test_tx_groupapplication:name: seata-ordermybatis:mapper-locations: classpath:mybatis/mapper/*.xmlseata:service:vgroup-mapping:my_test_tx_group: defaultgrouplist:default: 127.0.0.1:8091enable-degrade: falsedisable-global-transaction: false

主要多了服务分组和集群分组的配置:

同理,seata-account下的application.yml配置:

server:port: 8082servlet:context-path: /spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_account?serverTimezone=Asia/Shanghaiusername: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group: my_test_tx_groupapplication:name: seata-accountmybatis:mapper-locations: classpath:mybatis/mapper/*.xmlseata:service:vgroup-mapping:my_test_tx_group: defaultgrouplist:default: 127.0.0.1:8091enable-degrade: falsedisable-global-transaction: false

seata-web下的application.yml配置:

server:port: 80servlet:context-path: /spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848alibaba:seata:tx-service-group: my_test_tx_groupapplication:name: seata-webseata:service:vgroup-mapping:my_test_tx_group: defaultgrouplist:java1234-seata-server: 127.0.0.1:8091enable-degrade: falsedisable-global-transaction: false

seata-web项目->WebController->shopping方法,添加@GlobalTransactional注解

7.5 分布式案例测试

三个子项目一起运行;

两个RM在seata-server注册成功;

seata-web项目的RM,TM注册成功;

seata-order项目的TM注册成功;

seata-account项目的TM注册成功;

我们用postman 发送 http://localhost/shopping post请求

执行发现,订单表,和日志表都没有数据,说明测试OK;

7.6 setata二阶段提交过程剖析

因为是执行是一瞬间的,很多小伙伴根本无法感受到内部的二阶段提交过程。

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

  • 二阶段:

    • 提交异步化,非常快速地完成。

    • 回滚通过一阶段的回滚日志进行反向补偿。

所以我们在再seata-account项目里搞个断点,来看下回滚的一个流程;

seata-account项目debug启动;

再次postman测试,我们立刻查看db_order数据库表信息(比较难捕获,因为提交事务超时就立刻回滚,看不到信息)

订单服务执行完的时候,

db_order有数据

undo_log也有数据

说明一阶段业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

然后下面,如果提交事务超时或者有接口调用异常,则分支事务立刻根据回滚日志,立刻进行反向补偿,最后回滚日志会被清空;

如果接口调用一切正常,日志清空,全局事务提交,完成本次事务操作;

这篇关于三天学会阿里分布式事务框架Seata-应用seata AT模式方案解决分布式事务问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758996

相关文章

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是