分布式事务介绍 Seata架构与原理+部署TC服务 示例:黑马商城

server/2025/1/11 12:50:36/

1. 什么是分布式事务?

分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务

打个比方:就像一个跨国连锁超市的库存管理系统。它在中国、美国、欧洲等地都有仓库和数据库来记录库存。当全球统一补货的事务发生时,涉及这些不同地区的库存更新操作,这就是分布式事务。所有地区的库存更新都成功,这个补货事务才算成功;只要有一个地区更新库存出现问题,整个补货事务就要回滚,保证各地库存数据不会因为部分成功而出现混乱。

分布式事务所产生的问题:

  1. 数据一致性难题: 数据分散在不同节点,很难保证所有节点数据在事务前后都一致。比如电商系统里,下单减库存,可能出现库存减了但订单没生成的情况。
  2. 事务协调复杂: 要让多个节点的事务要么都成功要么都失败很复杂。因为节点可能出现故障、网络延迟等情况,很难统一控制。
  3. 性能损耗: 保证分布式事务的正确执行,需要更多的通信、协调和额外的操作,这会降低系统的整体性能。

这个时候就用到了在众多的开源分布式事务框架中,功能最完善、使用最多的就是阿里巴巴在2019年开源的Seata


2. 认识Seata

分布式事务产生的一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:

就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。

在Seata的事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

Seata的工作架构


3. 部署TC服务

这里我们使用黑马商城做为示例,所以对应的相关资料已准备好

 3.1  插入数据库表


3.2  准备配置文件并上传到虚拟机对应的目录中

准备了一个seata目录,其中包含了seata运行时所需要的配置文件

 将整个seata文件夹seata镜像jar包上传到虚拟机的/root目录

 

 

 

解压加载seata镜像jar包,命令:

docker load -i seata-1.5.2.tar

然后输入命令进行查看镜像是否存在:


3.3 Docker部署

操作前先确保mysqlnacos容器都在同一个网络里(本次网络名为hm-net)

查看网络详情命令: 

docker network inspect 网络名

将某容器加入指定网络命令: 

docker network connect [网络名] [容器名]

将两个容器都加入hm-net网络之后,便可以下面的命令:

docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.218.15 \  #自己虚拟机ip
-v ./seata:/seata-server/resources \
--privileged=true \
--network hm-net \
-d \
seataio/seata-server:1.5.2

 

安装完毕,通过docker ps 指令进行查看容器是否创建成功

 可以看到,已经容器创建成功!

通过日志命令查看seata

docker logs -f seata


 3.4 测试

打开Nacos控制台查看,发现服务管理->服务列表多了一个seata-server,说明注册上来了

 输入 http://192.168.218.15:7099/ 进入Seata控制台,账号和密码同一个:admin

因为我们application.yml配置文件中写的是admin

 登录页面

进入登录页面

到此,Seata部署完成!


http://www.ppmy.cn/server/157467.html

相关文章

内核模块里访问struct rq及获取rq_clock_task时间的方法

一、背景 在之前的 CFS及RT调度整体介绍_cfs任务和rt任务-CSDN博客 博客里,我们讲到了内核调度里的一个很重要的概念rq,即运行队列run queue。我们知道,每个cpu上都有一个struct rq的结构体,管理着per-cpu的运行队列的情况&#…

解决WordPress出现Fatal error: Uncaught TypeError: ftp_nlist()致命问题

错误背景 WordPress版本:wordpress-6.6.2-zh_CN WooCommerce版本:woocommerce.9.5.1 WordPress在安装了WooCommerce插件后,安装的过程中没有问题,在安装完成后提示: 此站点遇到了致命错误,请查看您站点管理…

【JAVA面试】java权限修饰符

在 Java 中,访问权限(Access Modifiers)用于控制类、方法、成员变量等的访问范围。合理使用访问权限能够增强代码的安全性、封装性以及可维护性。 Java 的访问权限修饰符 Java 提供了以下四种访问权限修饰符,分别是: …

学Java第二十六天---------static的用法

1.静态变量static 1.1什么是static 1.2什么是静态变量 1.3静态变量代码示例: public class Student {private String name;private int age;private String id;static String teacherName;public Student() {}public Student(String name, int age, String id) {this.name n…

2012mfc,几种串

串,即是由符组成的串,在标准C,标准C,MFC中串这一功能的实现是不相同的,C完全兼容了C. 1.标准C中的串 在标准C中没有串数据类型,C中的串是有符类型的符数组或符类型的符指针来实现的.如: char name[26]"This is a Cstyle string"; //或char *name"This is a…

Web3 社交革命:告别中心化,拥抱多元连接

随着互联网的发展,我们已经习惯了通过中心化平台与他人互动,无论是社交媒体、即时通讯还是在线社区,所有这些平台都由少数大公司控制。Web3的出现,意味着一种新的社交模式正在悄然崛起——去中心化社交网络(Decentrali…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…

Unity使用Vuforia插件进行AR开发

零、最终效果 Unity使用Vuforia插件进行AR开发 一、资源准备 1、在Unity中添加Vuforia插件 &#xff08;1&#xff09;在UnityAssetStore中搜索Vuforia插件并添加到自己的资源中 网页地址&#xff1a;https://assetstore.unity.com/packages/templates/packs/vuforia-engine…