分布式事务(3):AT模式实战-Seata

news2024/12/27 14:00:38

1 介绍

Seata(Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务框架)是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。Seata 开源半年左右,目前已经有接近一万 star,社区非常活跃。我们热忱欢迎大家参与到 Seata 社区建设中,一同将 Seata 打造成开源分布式事务标杆产品。

 Seata:https://github.com/seata/seata

1.1 Seata 产品模块

如下图所示,Seata 中有三大模块,分别是 TM、RM 和 TC。 其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署。

 

1.2 Seata支持的事务模型

Seata 会有 4 种分布式事务解决方案,分别是 AT 模式、TCC 模式、Saga 模式和 XA 模式。

 

2 AT模式实战

Seata中比较常用的是AT模式,这里我们拿AT模式来做演示,看看如何在SpringCloud微服务中集成Seata.

我们假定一个用户购买商品的业务逻辑。整个业务逻辑由3个微服务提供支持:

  • 仓储服务:对给定的商品扣除仓储数量。
  • 订单服务:根据采购需求创建订单。
  • 帐户服务:从用户帐户中扣除余额。

流程图:

 

订单服务在下单时,同时调用库存服务和用户服务,此时就会发生跨服务和跨数据源的分布式事务问题。

2.1 准备数据

执行资料中提供的seata_demo.sql文件,导入数据。

其中包含4张表。

Order表:

CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL COMMENT '用户id',
  `commodity_code` varchar(255) DEFAULT NULL COMMENT '商品码',
  `count` int(11) unsigned DEFAULT '0' COMMENT '购买数量',
  `money` int(11) unsigned DEFAULT '0' COMMENT '总金额',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

商品库存表:

CREATE TABLE `storage_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL COMMENT '商品码',
  `count` int(11) unsigned DEFAULT '0' COMMENT '商品库存',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `commodity_code` (`commodity_code`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

用户账户表:

CREATE TABLE `account_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL COMMENT '用户id',
  `money` int(11) unsigned DEFAULT '0' COMMENT '用户余额',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

还有用来记录Seata中的事务日志表undo_log,其中会包含after_image和before_image数据,用于数据回滚:

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`) USING BTREE,
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息系统项目管理师考试总结

1、结果展示 从结果上看,论文刚刚过,案例分析差两份,选择题差五分。 问题一:案例分析中,计算题可以拿到分,提高案例分析的通过率。计算题比较客观。可以在下一次考试中多准备准备。 问题二:客观…

QUIC的诞生

背景 自1999年HTTP/1.1被提出以来,它已经稳定地被使用超过了20个年头。不过经典并不意味着完美,HTTP/1.1中一个连接同一时刻只能处理一个HTTP请求,如果当前的请求没有结束之前,其他的请求只能处于阻塞状 态。这一“对头阻塞”问题…

权限管理的配置思路

1.在main.js中引入permission.js 2.permission.js中通过vuex中getters.access_token进行路由的重定向 直接import ‘.permission’

MSF基本使用和控制台命令

前言 ● Msfconsole使用接口 ○ 最流行的用户接口 ○ 几乎可以使用全部MSF功能 ○ 控制台命令支持TAB自动补全 ○ 支持外部命令的执行(系统命令等) ○ 点击鼠标启动 / msfconsole -h -q -r -v / exit ○ help / ? / help vulns 控制台命令 …

【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解)

【Python】利用Python实现精准三点定位(经纬度坐标与平面坐标转换法求解) 众所周知,如果已知三个点的坐标,到一个未知点的距离,则可以利用以距离为半径画圆的方式来求得未知点坐标。 如果只有两个已知点,则…

【Array数组】面试前基础知识点深度记忆总结

写本篇博客的原因是发现有人遇到了以下误区, 1、在我面试别人的过程中,我想让他说一下数组的一些内置方法和含义,然后他条例思路不太清晰,跳动着说,所以遗漏了很多,或许按照es5到es6是一个指导顺序&#xf…

51单片机——独立按键实验,小白讲解,相互学习

按键介绍: 按键是一种电子开关,使用时轻轻按开关按钮就可式开关接通,当松手时,开关断开。开发板上使用的按键及内部简易图如下图: 按键管脚两端距离长的表示默认是导通状态,距离短的默认是断开状态&#xf…

Pandas-根据数据表1中的字段a,筛选出数据表2中也包含字段a的数据

前言 本文是该专栏的第18篇,后面会持续分享python的数据分析知识,记得关注。 假设现在有个数据分析的需求,如下: 数据表1中有几十万条数据,数据表2中有几万条数据,两张数据表1和2有两个相同的字段phone,现在需要将数据表1和数据表2中,phone字段存在相同的行,保留下来…

redis集群操作

Redis集群1 集群2 集群架构图3 集群细节4 集群搭建4.1.创建集群4.2.查看集群状态4.3.添加主节点4.4.添加从节点4.5.删除副本节点4.6.集群在线分片1 集群 Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,支持slave-master选举…

Nmap系统扫描实战

今天继续给大家介绍渗透测试相关知识,本文主要内容是Nmap系统扫描实战。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权设备…

解决Win系统cad激活安装失败问题,AutoCad 2022 中文/英文正式详细安装教程

Autodesk AutoCAD 2022简称“cad 2022”是一款功能强大的CAD三维绘图辅助设计软件。autocad 2022适用于二维绘图、详细绘制、设计文档和基本三维设计,广泛应用于机械设计、工业制图、工程制图、土木建筑、装饰装潢、服装加工等多个行业领域。CAD2022新特征&#xff…

线径看板帮助电线电缆厂提高生产效率的工作原理

当今,市场上出现了越来越多的电线电缆品牌,电线电缆市场的竞争越来越激烈,电线厂家稍有不慎,出现了产品不规范、不合格的异常情况,就很可能会被市场淘汰,被消费者所抛弃。那么,要怎样才能够保障…

MVC(Model,View,Controller)

MVC是指Model(模型层,数据),View(视图层),Controller(控制层) 核心是DispathcherServlet(一个Servlet) (1) 客户端的请求提交给DispathcherServlet (2)DispathcherServl…

【动态规划篇】斐波那契数列拆分词句三角矩阵

🌠作者:阿亮joy. 🎆专栏:《数据结构与算法要啸着学》 🎇座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉…

基于Java(JSP+Servlet)+Mysql实现的(Web)简易的工资管理系统【100010062】

1.问题描述 一个公司下分为若干部门,每个部门有若干职员和经理,每个部门经销若干种商品。工资由基本工资、产品销售业绩奖、若干种保险的扣除等组成。其中的销售业绩奖按以下方式设计:职员按其完成额的 5% 提成,经理按其部门完成…

string.IsNullOrEmpty和string.IsNullOrWhiteSpace的区别

string.IsNullOrEmpty和string.IsNullOrWhiteSpace 本人一直使用的是string.IsNullOrEmpty方法来判断字符串是否为空. 在插件中发现另外一种写法: string s1 null; string s2 string.Empty; string s3 ""; strin…

精通MyBatis原理,看这两篇就够了!(二)

本文是关于MyBatis源码的第二篇,解读了MyBatis的核心执行SQL流程,对源码做了详细注释。内容较长,推荐电脑阅读。点击上方“后端开发技术”,选择“设为星标” ,优质资源及时送达执行阶段流程第一篇文章讲解了Mybatis启动…

【jdk11+jprofiler 11进行java程序性能调优案例之--内存溢出原因分析】

1.安装jprofiler jprofiler_windows-x64_11_0_2.exe 2.使用KeyGen.exe生成注册码然后输入 3.idea中安装jprofiler插件 File-->Setting-->Plugins 搜索jprofiler插件然后安装 4.以一个内存溢出的程序为例子进行分析(一直分配内存,List容器引用着Student导致…

Java创建线程的三种方式

Java创建线程的三种方式 一、通过Thread类的方式进行创建 步骤: 1、创建Thread的子类,重写run方法,run方法就表示线程需要完成的任务 2、创建Thread实例,也就是创建线程对象 3、使用start来启动线程(线程启动的唯一方…

显著性分析

选择图 为什么要分Non-parametric & parametric 方法 为了找到更符合数据的分析方法。每个方法有自己的假设&#xff0c;如果违背了结果会不精准。 Sign Test 是一个可以用于任何数据分布情况的pairwise 方法。 检查normality: Sample 数量 < 50,适用 Shapiro-Wilk&am…