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

article/2025/10/22 14:18:13

1、什么是分布式事务

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。

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

2.1、数据库分库分表

当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多个数据库。这时候,如果一个操作既访问01库,又访问02库,而且要保证数据的一致性,那么就要用到分布式事务。6514a63ea73a289e371c0aacc557f611.png

2.2、应用SOA化

所谓的SOA化,就是业务的服务化。比如原来单机支撑了整个电商网站,现在对整个网站进行拆解,分离出了订单中心、用户中心、库存中心。对于订单中心,有专门的数据库存储订单信息,用户中心也有专门的数据库存储用户信息,库存中心也会有专门的数据库存储库存信息。这时候如果要同时对订单和库存进行操作,那么就会涉及到订单数据库和库存数据库,为了保证数据一致性,就需要用到分布式事务。bea200f0729f7ca61a3174f5115f53d2.png

以上两种情况表象不同,但是本质相同,都是因为要操作的数据库变多了!

3、事务的ACID特性

3.1、原子性(A)

所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。

3.2、一致性(C)

事务的执行必须保证系统的一致性,就拿转账为例,A有500元,B有300元,如果在一个事务里A成功转给B50元,那么不管并发多少,不管发生什么,只要事务执行成功了,那么最后A账户一定是450元,B账户一定是350元。

3.3、隔离性(I)

所谓的隔离性就是说,事务与事务之间不会互相影响,一个事务的中间状态不会被其他事务感知。

3.4、持久性(D)

所谓的持久性,就是说一单事务完成了,那么事务对数据所做的变更就完全保存在了数据库中,即使发生停电,系统宕机也是如此。

4、分布式事务的应用场景

4.1、支付

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

4.2、在线下单

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

5、常见的分布式事务解决方案

5.1、基于XA协议的两阶段提交

XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。XA实现分布式事务的原理如下:1f839ec730607c5834b42ed3b82a9974.png

总的来说,XA协议比较简单,而且一旦商业数据库实现了XA协议,使用分布式事务的成本也比较低。但是,XA也有致命的缺点,那就是性能不理想,特别是在交易下单链路,往往并发量很高,XA无法满足高并发场景。XA目前在商业数据库支持的比较理想,在mysql数据库中支持的不太理想,mysql的XA实现,没有记录prepare阶段日志,主备切换回导致主库与备库数据不一致。许多nosql也没有支持XA,这让XA的应用场景变得非常狭隘。

5.2、消息事务+最终一致性

所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,开源的RocketMQ就支持这一特性,具体原理如下:d56f32f4fc15351c90093dd43b5fc217.png

1、A系统向消息中间件发送一条预备消息

2、消息中间件保存预备消息并返回成功

3、A执行本地事务

4、A发送提交消息给消息中间件

通过以上4步完成了一个消息事务。对于以上的4个步骤,每个步骤都可能产生错误,下面一一分析:步骤一出错,则整个事务失败,不会执行A的本地操作

步骤二出错,则整个事务失败,不会执行A的本地操作

步骤三出错,这时候需要回滚预备消息,怎么回滚?答案是A系统实现一个消息中间件的回调接口,消息中间件会去不断执行回调接口,检查A事务执行是否执行成功,如果失败则回滚预备消息

步骤四出错,这时候A的本地事务是成功的,那么消息中间件要回滚A吗?答案是不需要,其实通过回调接口,消息中间件能够检查到A执行成功了,这时候其实不需要A发提交消息了,消息中间件可以自己对消息进行提交,从而完成整个消息事务

基于消息中间件的两阶段提交往往用在高并发场景下,将一个分布式事务拆成一个消息事务(A系统的本地操作+发消息)+B系统的本地操作,其中B系统的操作由消息驱动,只要消息事务成功,那么A操作一定成功,消息也一定发出来了,这时候B会收到消息去执行本地操作,如果本地操作失败,消息会重投,直到B操作成功,这样就变相地实现了A与B的分布式事务。原理如下:7abc320bb404b5ed85c3e719da35573c.png

虽然上面的方案能够完成A和B的操作,但是A和B并不是严格一致的,而是最终一致的,我们在这里牺牲了一致性,换来了性能的大幅度提升。当然,这种玩法也是有风险的,如果B一直执行不成功,那么一致性会被破坏,具体要不要玩,还是得看业务能够承担多少风险。

5.3、TCC编程模式

所谓的TCC编程模式,也是两阶段提交的一个变种。TCC提供了一个编程框架,将整个业务逻辑分为三块:Try、Confirm和Cancel三个操作。以在线下单为例,Try阶段会去扣库存,Confirm阶段则是去更新订单状态,如果更新订单失败,则进入Cancel阶段,会去恢复库存。总之,TCC就是通过代码人为实现了两阶段提交,不同的业务场景所写的代码都不一样,复杂度也不一样,因此,这种模式并不能很好地被复用。

6、总结

分布式事务,本质上是对多个数据库的事务进行统一控制,按照控制力度可以分为:不控制、部分控制和完全控制。不控制就是不引入分布式事务,部分控制就是各种变种的两阶段提交,包括上面提到的消息事务+最终一致性、TCC模式,而完全控制就是完全实现两阶段提交。部分控制的好处是并发量和性能很好,缺点是数据一致性减弱了,完全控制则是牺牲了性能,保障了一致性,具体用哪种方式,最终还是取决于业务场景。作为技术人员,一定不能忘了技术是为业务服务的,不要为了技术而技术,针对不同业务进行技术选型也是一种很重要的能力


http://chatgpt.dhexx.cn/article/7Htx7g15.shtml

相关文章

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() 函数使用…

HSL值,HSLA,文档流,盒子模型等问题。

HSL和HSLA值 和上一篇文章中的rgb语法使用方法基本一样 H:色相&#xff0c;调节范围为0-360度&#xff0c;其实就是一个环&#xff0c;零度等于360度是红色&#xff0c;调节颜色。S&#xff1a;饱和度&#xff0c;调节颜色浓度&#xff0c;调节范围&#xff08;0%-100%&#x…

CSS中hsla的用法

hsla是css3引入的一个颜色表达方式&#xff0c;今天就来学习一下它的用法。 文章目录 1.什么是HSLA2.怎么去使用HSLA3.什么时候使用HSLA4.注意事项 1.什么是HSLA HSLA(H,S,L,A) H&#xff1a;Hue(色调)。0(或360)表示红色&#xff0c;120表示绿色&#xff0c;240表示蓝色&…

Gabor滤波器 pytorch实现

Gabor函数与人眼的生物作用相仿&#xff0c;尤其对于图片的方向和尺度特征可以很好的捕捉。所以&#xff0c;经常用于纹理、物体识别。对于Gabor的原理、公式不再赘述。 下面对Gabor滤波器用pytorch实现&#xff0c;并进行可视化&#xff1a; import math import torch import…

【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取

OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】193.基于Gabor 滤波器的特征提取 6.5 Gabor 滤波器 Gabor 变换是一种加窗短时傅里叶变换&#xff0c;以高斯函数作为短时傅里叶变换的窗函数&#xff0c;因此可以在频域不同尺度、不同方向上提取特征。 G…

Python OpenCV实现Log Gabor滤波器(由LGHD描述符扩展)

引言 笔者在研究红外图像与可见光图像配准时接触到了很多描述符&#xff0c;其中关于LGHD描述符的Log Gabor滤波器很有意思&#xff0c;与大家分享 LGHD&#xff08;Log-Gabor Histogram Descriptor&#xff09; 描述符的思想是基于高频分量分布的描述符对于不同的非线性强度…

python实现Gabor滤波器-skimage(一)

什么是Gabor滤波器&#xff1f; Gabor滤波器是一种由正弦波调制的高斯核线性滤波器。Gabor滤波器的频率和方向表示与人类视觉系统相似。Gabor滤波器组通常用于计算机视觉和图像处理。特别适用于边缘检测和纹理分类。一个二维Gabor滤波器是一个由正弦平面波调制的高斯核函数。好…