ins-分布式事务及其解决方案-ins (ins分地区吗)
背景
在讲解分布式事务的概念之前,让我们回顾一下与事务相关的基本概念。
1.1 事务的基本概念
事务是一个程序执行单元,其中的操作要么全部成功执行,要么全部失败,不允许只成功一半而一半执行失败。
1.2 事务的基本特性
事务具有四个重要的特性,即 ACID:
- 原子性 (Atomicity):事务中的所有操作要么全部执行成功,要么全部回滚。
- 一致性 (Consistency):事务必须使数据库从一个一致的状态转换到另一个一致的状态。
- 隔离性 (Isolation):事务与其他并发事务隔离,不会互相影响。
- 持久性 (Durability):一旦事务提交,其更改就应该是永久性的,即使系统发生故障。
分布式事务
分布式事务从本质上来说与数据库事务的概念是一致的,即满足事务的基本特性 (ACID)。但是,由于分布式事务涉及多个独立节点上的数据访问,因此其表现形式与本地事务有很大不同。
本地事务中,如果需要同时操作数据库中的多条记录,可以通过使用数据库的事务机制来实现。在微服务架构中,原本一个本地逻辑执行单元被拆分到了多个独立的微服务中,这些微服务又分别操作了不同的数据库和表。
分布式事务旨在解决微服务架构(即分布式系统)中不同节点之间的数据一致性问题。这个问题本质上与传统事务需要解决的问题一致,即在多个微服务调用链中的一个请求,所有服务的数据处理要么全部成功,要么全部回滚。
分布式事务实现
分布式事务有多种实现方式,最具代表性的两种是 XA 分布式事务协议提出的两阶段提交 (2PC) 和三阶段提交 (3PC)。
3.1 两阶段提交 (2PC)
两阶段提交又称为 2PC (two-phase commit protocol),是一个经典的强一致、中心化的原子提交协议。
3.1.1 2PC 运行原理
两阶段提交顾名思义需要进行两个阶段的提交:
- 准备阶段 (投票阶段):事务协调器向所有参与者 (微服务) 发送 prepare 请求,询问它们是否准备好提交事务。如果所有参与者都返回 "准备好",协调器将进入提交阶段。
-
提交阶段 (执行阶段):
- 如果所有参与者在准备阶段都返回了 "准备好",协调器将向所有参与者发送提交请求。参与者将提交自己的本地事务,并向协调器发送确认消息。
- 如果任何一个参与者在准备阶段返回了 "失败",则协调器将向所有参与者发送回滚请求。参与者将回滚自己的本地事务,并向协调器发送确认消息。
3.1.2 2PC 存在的问题
2PC 通过添加事务协调器的角色和两个阶段处理流程来解决分布式系统中事务跨多个服务的数据一致性问题。但是,2PC 存在一些问题:
- 单点故障:事务协调器是一个单点故障,如果它发生故障,整个事务将失败。
- 死锁:当两个事务同时尝试访问相同资源时,可能会发生死锁。2PC 无法检测到死锁,并且会一直阻塞直到超时。
- 性能问题:2PC 涉及两次网络往返,这可能会影响性能。
3.2 三阶段提交 (3PC)
三阶段提交又称为 3PC,在 2PC 的基础上增加了 CanCommit 阶段,并引入了超时机制。
一旦事务参与者迟迟没有收到事务协调器的消息,就会触发超时机制,参与者将释放资源并进入不确定状态。事务协调器会收集所有参与者的状态,并根据大多数参与者的状态来决定是提交还是回滚事务。
3PC 的引入解决了 2PC 的一些问题,如死锁和协调器单点故障,但它也增加了一次网络往返,降低了性能。
结论
分布式事务是微服务架构中解决数据一致性问题的重要技术。两阶段提交 (2PC) 和三阶段提交 (3PC) 是两种最常见的分布式事务实现方式,它们各有利弊。
在选择分布式事务实现时,需要考虑具体的需求,如:性能、可靠性、容错性等因素。不同的场景可能需要不同的分布式事务实现。
一篇教你通过Seata解决分布式事务问题
Seata的设计目标其一是对业务无侵入,因此从业务无侵入的2PC方案着手,在传统2PC的基础上演进,并解决2PC方案面临的刚性事务问题。
首先:AT模式是由2PC演变而来,在2PC的基础上增加了数据镜像(undolog表)的功能来实现分布式事务的回滚。
流程:
案例:
1、user业务表
2、执行业务SQL: update user set age = 20 where name = “王明”;
3、Seata会拦截该业务SQL,对该SQL添加前置镜像、后置镜像并将前置、后置镜像得到的数据记录到undolog表中:
前置镜像:业务SQL修改之前的数据;
后置镜像:业务SQL修改之后的数据。
前置镜像的到的数据:
后置镜像得到的数据:
4、如果执行回滚操作,则根据XID读取undolog表中的前置镜像和业务SQL信息,并生成回滚SQL语句执行:
5、如果执行提交,则直接把undolog表中,相关镜像删除即可。
本次实践为seata最新版本为v1.5.1 ,
下载地址,下载下来进行解压,目录结构如下:
进入bin目录直接启动seata ,
seata服务默认端口是8091、客户端端口7091
window下双击运行下运行
输出以下信息表示启动成功,默认Seata服务端口8091
Seata服务端支持三种存储模式():
新建一个seata数据库实例,然后导入以下SQL,或者导入学习资料中提供的。
注意:seata数据库字符集需要是utf8mb4 -- UTF-8 Unicode
可以使用资料中的 文件,通过java -jar 的方式启动nacos服务,启动nacos前需要修改数据源地址。
学习资料中提供了nacos依赖的数据库SQL文件:
资料下载地址:
highlight=true>配置文件 ,修改config、registry的type值为nacos
注意:如果使用了Nacos作为配置中心,那么就不需要在该配置文件中配置store,Seata会从Nacos配置中心读取。
进入bin目录启动Seata , Seata服务默认端口是8091、客户端端口7091
window下双击运行下运行
注意:
ins错误怎么解决?
ins显示技术导致的页面错误通常是由于技术故障、代码错误或服务器问题所引起的。 1. 技术故障:在使用ins显示技术时,可能会遇到一些技术故障,例如硬件故障或软件故障。 这些故障可能会导致页面加载缓慢或出现错误。 例如,如果服务器的硬盘出现故障,那么网站可能无法加载,导致出现页面错误。 2. 代码错误:代码错误是导致页面错误的常见原因之一。 在开发ins显示技术的网站或应用程序时,开发人员可能会编写错误的代码,导致页面无法正常工作。 例如,如果代码中存在语法错误或逻辑错误,那么页面可能会出现乱码或无法加载。 3. 服务器问题:服务器问题也可能导致ins显示技术的页面错误。 如果服务器遭受攻击或负载过重,那么它可能无法正确处理请求,导致页面出现错误。 此外,如果服务器的配置不正确,那么它可能无法正确地处理与ins显示技术相关的请求,导致页面错误。 综上所述,ins显示技术导致的页面错误可能是由多种因素引起的。 为了避免这些问题,开发人员应该仔细测试他们的代码,并确保服务器配置正确。 此外,他们还应该使用可靠的硬件和软件,并定期维护和更新它们。 用户可以尝试刷新页面、检查网络连接或联系技术支持以解决页面错误问题。 如果问题仍然存在,那么他们可能需要等待开发人员修复问题或寻找其他可靠的ins显示技术解决方案。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。