java分布式事务的解决方案

article/2025/10/22 14:22:15

1.什么是分布式事务

在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务,(强调的是多个系统通过网络协议同时完成一个事务过程)
在这里插入图片描述

2.分布式事务的产生的原因

2.1 数据库分表分库

当数据库的数据比较大的时候达到成千上万的数据的时候,我们就需要对数据库进行分表分库处理来实现对服务器的压力,这时候如何保证数据的一致性,就需要引入分布式事务;
在这里插入图片描述
2.2 应用SOA化
所谓的SOA化就是把服务器进行拆分,单台服务器拆分为多台服务(根据业务型进行划分为多台服务),在我们只有一台服务的时候,为了保证数据一致性,我们都是使用的是数据的ACID来实现的,现在是多台服务器的时候,采用ACID已经无法满足我们的需求了;

2.3 事务的ACID特性
1、原子性
在整个事务中操作,要不全部成功,要不全部失败,没有所谓的中间状态的出现,

2、一致性
事务的操作中,保证事务的一致性,

3、隔离性
事务与事务之间相互隔离互不影响,

4、持久性
事务结束以后所有的事务操作的结果都需要存入数据库中。

3.分布式事务使用的场景

3.1 支付

最经典的场景就是支付了,一笔支付,是对买家账户进行扣款,同时对卖家账户进行加钱,这些操作必须在一个事务里执行,要么全部成功,要么全部失败。而对于买家账户属于买家中心,对应的是买家数据库,而卖家账户属于卖家中心,对应的是卖家数据库,对不同数据库的操作必然需要引入分布式事务。

3.2 下单

买家在电商平台下单,往往会涉及到两个动作,一个是扣库存,第二个是更新订单状态,库存和订单一般属于不同的数据库,需要使用分布式事务保证数据一致性。
在这里插入图片描述

CAP理论

如何进行分布式事务控制?CAP理论是分布式事务处理的理论基础,CAP有助于我们了解分布式事务的处理方案。
CAP理论是:分布式系统在设计时只能在一致性(Consistency),可靠性(Availability),分区容忍性(Partition Tolerance),满足两种,无法兼顾三种。
在这里插入图片描述
一致性(Consistency):服务A、B、C三个节点都存储了用户信息数据,三个节点的数据需要保持同一时刻数据的一致;
可靠性(Availability):服务A、B、C三个节点,其中一个节点宕机不影响整个集群对外服务,如果只服务与一个服务器,只要这个服务宕机,必然会导致无法提供的问题。
分区容忍性(Partition Tolerance):分区容忍性就是允许系统通过网络协同工作。分区容忍性要解决由于网络分区导致数据的不完整及无法访问等问题。

分布式系统不可避免的出现了多个系统通过网络协同工作的场景,结点之间难免会出现网络中断、网延延迟等现象,这种现象一旦出现就导致数据被分散在不同的结点上,这就是网络分区

分布式系统能否兼容C、A、P?

在保证分区容忍性的前提下一致性和可用性是无法兼容的,要提高系统的可用性就需要增加更多的节点,但是节点多系统的一致性就差,因此分布式系统是无法同时保证,一致性、可用性、分区容忍性这个是不可能做到的。
CAP有哪些组合?
1.CA:一致性+高可用,
2.AP:高可用+分区容忍性,追求的是最终一致性,
说明:这里放弃一致性是指放弃强一致性,强一致性就是写入成功立刻要查询出最新数据。追求最终一致性是指允许暂时的数据不一致,只要最终在用户接受的时间内数据 一致即可
3.CP:放弃可用性,加强一致性和分区容忍性,一些强一致性要求的系统按CP进行设计,比如跨行转账,一次转账请求要等待双方银行系统都完成整个事务才算完成。
说明:由于网络问题的存在CP系统可能会出现待等待超时,如果没有处理超时问题则整理系统会出现阻塞
总结:​ 在分布式系统设计中AP的应用较多,即保证分区容忍性和可用性,牺牲数据的强一致性(写操作后立刻读取到最新数据),保证数据最终一致性。比如:订单退款,今日退款成功,明日账户到账,只要在预定的用户可以接受的时间内退款事务走完即可。

4.分布式事务的解决方案

两阶段提交协议(2PC)
为解决分布式系统的数据一致性问题出现了两阶段提交协议(2 Phase Commitment Protocol),两阶段提交由协调者和参与者组成,共经过两个阶段和三个操作,部分关系数据库如Oracle、MySQL支持两阶段提交协议。
第一阶段:准备阶段
协调者通知参与者准备提交订单,参与者开始投票,参与者完成协调工作向协调者发出yes,
第二阶段:提交和回滚阶段
协调者完成准备工作后发出提交指令。如果出现问题就立马进程回滚操作;
在这里插入图片描述
1.协调者(应用服务器),连接两台数据库
2.协调者向两台服务器发出准备工作,二台数据库接受到准备的指令(执行本地事务),但是不提交,向协调者发出yes,如果都收得到yes,则执行提交事件,如果一个数据源发出no的指令,立马执行回滚操作。
2PC优点:执行强一致 部分关系数据库支持(Oracle、MySQL等)。(CP)
缺点:整个事务的执行需要由协调者在多个节点之间去协调,增加了事务的执行时间,性能低下。

事务补偿(TCC)
TCC事务弥补是基于2PC实现业务层事务控制方案,TCC由try,confirm,cancel 三部分组成
1:try检查以及预留业务资源完成提交事务前的检查,预留好资源
2:confirm确定执行业务操作,对try预留的资源进行正式执行
3:cancel取消执行业务操作,并且对try的资源进行回滚
在这里插入图片描述
1、Try
下单业务由订单服务和库存服务协同完成,在try阶段订单服务和库存服务完成检查和预留资源。
订单服务检查当前是否满足提交订单的条件(比如:当前存在未完成订单的不允许提交新订单)。
库存服务检查当前是否有充足的库存,并锁定资源。
2、Confirm
订单服务和库存服务成功完成Try后开始正式执行资源操作。
订单服务向订单写一条订单信息。
库存服务减去库存。
3、Cancel
如果订单服务和库存服务有一方出现失败则全部取消操作。
订单服务需要删除新增的订单信息。
库存服务将减去的库存再还原。
优点:最终保证数据的一致性,在业务层实现事务控制,灵活性好。(AP)
缺点:开发成本高,每个事务操作每个参与者都需要实现try/confirm/cancel三个接口。
注意:TCC的try/confirm/cancel接口都要实现幂等性,在为在try、confirm、cancel失败后要不断重试。

什么是幂等性?

幂等性是指一个操作无论请求多少次,执行结果都一样
幂等性实现方式:
一,操作前在业务方法进行判断如果执行了就不再执行
二,缓存所有请求和处理的结果,已经处理的请求则直接返回结果。
三,在数据库表中加一个状态字段(未处理,已处理),数据操作时判断未处理时再处理。

消息队列实现最终一致

将分布式事务拆分成多个本地事务来完成,并且由消息队列异步协调完成
在这里插入图片描述
1、订单服务和库存服务完成检查和预留资源。
2、订单服务在本地事务中添加订单记录和添加减少库存的信息
3、定时任务会根据消息表中的记录将消息发送到MQ中异步通知库存服务减少库存
4、库存服务执行减少库存信息,并且记录减少库存信息的记录日志,
5、库存服务向MQ发送减少库存信息
6、订单服务接收到完成库存减少的消息后删除原来添加的“减少库存任务消息”。
实现最终事务一致要求:预留资源成功理论上要求正式执行成功,如果执行失败会进行重试,要求业务执行方法实现幂等
优点 :
由MQ按异步的方式协调完成事务,性能较高。
不用实现try/confirm/cancel接口,开发成本比TCC低。
缺点:
此方式基于关系数据库本地事务来实现,会出现频繁读写数据库记录,浪费数据库资源,另外对于高并发操作不是最佳方案


http://chatgpt.dhexx.cn/article/AHymyNj8.shtml

相关文章

java分布式系统架构图,2022吊打面试官系列

前言 如果你不能拼爹,或者不想拼爹,最好的方法是拼实力。 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 所以,你必须要从基层做起。当然,所谓的基层&#…

offer拿到手软,java分布式面试题及答案

前言 今天的分享主要是讲下这个 redis,什么是缓存雪崩、穿透和击穿。这三个技术问题是我们平时开发工作中和面试过程中,必须要会的知识点,因为目前的互联网系统没有几个不需要用到缓存的,只要用到缓存的话,就需要掌握…

java分布式应用设计核心技术

java分布式应用设计核心技术(1) 前言: CPA理论说:在分布式系统中数据强一致性和服务高可用只能二选一,所以在BASE理论中提出:服务基本可用,数据允许软状态存在,实现数据最终一致性。 在分布式…

Java分布式架构:应用+特点+架构模式

目前企业应用的架构其实有很多,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等。和这些架构相关的管理型技术方法也有很多,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等。为了方便大家加深学习印象,千锋小编汇总了一些关于…

Java分布式系统框架教程,架构设计

一.主流架构模型SOA架构和微服务架构 SOA架构 SOA全称(ServiceOrientedArchitecture)中文意思为面相服务的架构,他是一种设计方法,轻重包含多个服务,服务之间通过相互依赖最终提供一系列的功能,一个服务通常以独立的形式存在与操作系统进程中,各个服务之间通过网络调用…

java分布式事务框架_Java分布式事务,及解决方案

1、什么是分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服…

Java 分布式解决方案

文章目录 一、基础知识1. CAP理论2. BASE理论3. 分布式共识算法3.1 Raftleader electionLog Replication 二、 分布式锁1. Redis 分布式锁1.1 加锁1.2 解锁1.3 RedissonRLock 1.4 总结 2. ZooKeeper 分布式锁2.1 基本原理2.2 curator 实现 3. 两者的对比 三、 分布式事务1. 2PC…

Java分布式、微服务概念

1. 分布式 1.1 分布式是什么 分布式系统在《分布式系统原理与范型》一书中有如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”。 分布式系统是建立在网络之上的软件系统,是一组通过网络进行通信、为…

浅谈Java分布式与集群

在日常操作中,相信很多人在怎么理解Java分布式与集群问题上存在疑惑,今天就大概说说,不注意听,觉得两个可能是同一个东西,其实这个是两个概念。 一句话概括:分布式是以缩短单个任务的执行时间来提升效率的…

java分布式技术

分布式技术 1.软件架构的演进 (1)单体应用阶段 ​ 小型项目(体量比较小,用户比较少这种)LAMP linux操作系统 apache httpd mysql php ​ 把应用服务器数据库等部署到同一台服务器上 (2&#xff09…

JAVA分布式(一)——了解分布式

一年的时间,终于学到了分布式的时候 在进行实践前,要先了解什么是分布式?分布式的意义是什么?(面试大几率会问,如果你写了的话) 目录 一、什么是分布式?二、分布式的特点三、分布…

java分布式入门

分布式入门: 先理解为什么需要分布式,因为服务器处理的能力需要提升,这里有两个方面,第一是纵向 也就是增加cpu的能力,或者加内存;另一个方向就是 横向 ,就是分布式。将本来一台计算机的压力分给…

网站开发进阶(六十七)浅谈css中hsl()和hsla()设置颜色值的方法与应用

前言 HSL 是CSS3引进的一种将 RGB 色彩模型中的点在坐标系中的表示法。这两种表示法试图做到比基于笛卡尔坐标系的几何结构 RGB 更加直观。 定义与用法 hsl() 函数使用色相、饱和度、亮度来定义颜色。 HSL 即色相、饱和度、亮度(英语:Hue, Saturati…

CSS第二章:3.颜色单位(HSL值、HSLA值)

总览 1.HSL值 H - 色相,S - 饱和度,L - 亮度 2.HSLA值 A - 透明度 一、色相 - H 1.取值范围:0~360 二、饱和度 - S 1.取值范围:0~100% 三、亮度 - L 1.取值范围:0~100% 四、HSL值 实操 1.HTML代码&#xff…

CSS 的 hsl() 和 hsla() 函数(设置颜色的方式之一)

一:CSS中的 hsl()函数: 1、定义与用法:hsl() 函数使用色相、饱和度、亮度来定义颜色。 HSL 即:色相(Hue)、饱和度(Saturation)、亮度(Lightness)。 色相&a…

css rgba/hsla知识点讲解及半透明边框

一、RGBA(R,G,B,A) 参数: R:红色值。正整数 | |百分数 G:绿色值。正整数 | |百分数 B:蓝色值。正整数 | |百分数 A:Alpha透明度。取值0~1之间。 说明:此色彩模式与RGB相同,只是在RGB模式上新增了Alpha透明…

HSLA制作配色表

<!doctype html> <html lang"en"><head><meta charset"UTF-8"><title>HSLA制作配色表</title><style>.table-wrap {width: 400px;margin: 10px;float: left;}table {width: 400px;border: 1px solid #756c6c;bo…

css中hsla代表_hsla()函数以及CSS中的示例

css中hsla代表 Introduction: 介绍&#xff1a; The use of functions is very beneficial for web development and one must learn as many functions as they can, therefore keep learning functions for improving your knowledge and coding skills. Besides, you shoul…

rgba和hsla

在css3中可以用RGBA和HSLA,都可以用来在设置颜色的同时也可以设置它的透明度。RGBA指的是“红色、绿色、蓝色和Alpha透明度”&#xff08;Red-Green-Blue-Alpha&#xff09;&#xff0c;而HSLA则代表“色调、饱和度、亮度和Alpha透明度”&#xff08;Hue-Saturation-Lightness-…

CSS hsla函数

和ARGB一样&#xff0c;都是用来表示颜色的。表示的效果都是一样的&#xff0c;只是形式不同。 一般情况下&#xff0c;你是用不上的&#xff0c;因为一般用ARGB比较多&#xff0c;也更熟悉。但是有些书籍喜欢用这种形式&#xff0c;还是要了解一下的。 定义 hsla() 函数使用…