当前位置: 首页 > news >正文

分布式事务

数据库事务

Atomicity 原子性
某个操作,要么全部执行完毕,要么全部回滚

Consistency 一致性
数据库中的数据全都符合现实世界的约束,则这些数据就符合一致性。
比如性别约束男or女,人名币面值不能为负数;出生地址不能为null;参与转账的账户总余额不变;等等。

Isolation 隔离性
多个事务访问相同数据时,对该数据不同状态的转换对应的数据库操作的执行顺序有一定的规律,彼此不干涉

Burability 持久性
现实中的状态转换映射到数据库中,意味着对数据所做的修改都应该在磁盘中保存

事务的状态有哪些?
事务的状态事务并发执行时数据一致性问题有哪些?

脏读
如果一个事务提取到了另一个未提交事务(小丽)修改过的数据。就意味着发生了脏读现象
脏读

不可重复读
如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读现象,或者叫模糊读FuzzyRead
不可重复读
幻读
如果一个事务先根据某些搜索条件(select … where vip=‘是’)查询到了一些记录,但是在该事务并未提交时,另一个事务(小丽)写入了一些符合上面搜索条件的记录(这里的写入可以值insert、delete、update操作。例如:insert into … values(‘0003’,700,‘是’),就意味着发生了幻读现象。
幻象读

SQL事务隔离级别

事务隔离级别无论哪种隔离级别,都不允许脏写的情况发生,所以没有列入表格内

分布式场景下事务及数据一致性问题

在系统开发过程中,我们据大部分时间使用的是关系型数据库,那么当数据量不大的时候,我们通过单库单表就可以保证某个业务数据的存储能力了,并且通过数据库对事务的支持,可以很好的解决数据一致性问题。

但是,当数据量增大了之后,不仅仅是单表查询效率Bianca低下,而且数据所占用空间的限制,都会促使着我们采用分库分表的解决方案。但是当涉及到分库的时候,却打破了我们依赖数据库控制事务一致性的便捷方式,只能物品们采用其他方案来进行事务的控制,因此分布式场景下数据一致性问题就显著的凸显了出来。

既然谈到分库,我们来看一下常见的两种分库方式,即:水平分库和垂直分库。

  • 水平分库
    当公司在创业初期,业务刚刚起步,我们的订单表每天能产生5W条数据,那么放到一张表中完全可以应对现在的业务需求。

但是随着公司的发展,业务逐一的在推进,订单量一年后,突增为100W,那为了应对公司业务的发展和高速增长的订单量,就会将数据库扩展为A,B,C这三个库,并且在每个数据库中按照相同的表结构复制出多份,来平均分摊每天产生的订单。那么这种分库的方式,就是水平分库。

水平分库

  • 垂直分库
    随着公司发展,我们都无法避免要从创业初期的单体架构拆分成微服务架构,那么针对不同的业务域会进行服务的拆分,那么面对着代码曾念的解耦解决了之后,面对数据库层面的解耦如何处理呢?

那么,很容易我们就会想到,要将A库按照不同的业务域进行拆分,比如:拆分成订单库,删评库存库,支付库等等。那么面对着这种数据库的拆分方式,就是垂直分库了,如下图所示:

垂直分库

分布式事务解决方案

分布式服务购物逻辑伪代码实现
我们以快捷支付的方式在商城购买商品为例(即:下完订单自动支付),看一下分布式事务在实现上与非分布式的区别。前提是我们针对订单服务、库存服务和支付服务这三个服务都有对应的三个数据库,分别是订单库、库存库和支付库。

如果我们平时以声明式事务来编码,那么他与本地事务在编码上没有区别,都是标注一个@Transaction注解而已,但是如果以编程式事务来实现的话,就能在写法上看出差异了,伪代码如下所示:
分布式事务
由于订单,库存和支付是三个服务和数据库,所以,我们需要分别开启这三个数据库事务,并且执行完毕后,分别执行三次commit操作

如果在调用payTransaction.commit()方法时,出现了异常,那么由于order和stock已经成功的调用了commit,所以,无法执行rollback操作了。而只有pay服务可以正常回滚。那么,就造成了分布式事务的不一致性。

分布式事务解决方案概述

  • 刚性事务(强一致性事务)
    XA
    2PC
    3PC

  • 柔性事务
    可靠时间队列
    TCC
    SAGA
    基于数据补偿

刚性事务 - XA
为了解决分布式事务一致性问题,X/Open组织提出了一套名为X/Open XA的处理事务架构,其核心内容是定义了全局的事务管理器和局部的资源管理器之间的通信接口。XA接口是双向的,能在一个事务管理器和多个资源管理器之前形成通信桥梁,通过协调多个数据源的一致动作,实现全局事务的统一提交或者统一回滚。

XA并不是Java的技术规范,二十一套跟语言无关的通用规范,所以Java中专门定义了JSR 907 Java Transaction API, 基于XA模式在Java语言中实现了全局事务处理的标准,这也就是我们现在熟知的JTA。

JTA最主要的两个接口如下:

  1. 事务管理器接口
  2. 满足XA规范的资源定义接口
  • 刚性事务(2PC)
    为了保证整个事务的一致性,XA将事务提交拆分成两阶段,即:二段式提交协议,交互时序示意图如下所示:
    2PC刚性事务
  • 刚性事务(3PC)
    为了缓解2PC中协调者的单点问题和准备阶段的性能问题,后续发展出了“三段式提交”,即: 3PC协议,交互时序示意图如下所示:
    3PC

柔性事务(可靠事务队列)

以快捷支付为例,当用户下单的时候,自动就进行了支付扣款操作。那么创建订单、扣减库存和支付扣款这三个操作就应该是一个原子性的操作。那么如果我们采取可靠时间队列的方式,则流程如下图所示:

可靠事务队列

  • 柔性事务(TCC)
    TCC 是 Try-Confirm-Cancel的缩写,是常见的分布式事务机制

在具体实现上,TCC较为繁琐,他是一种业务侵入式较强的事务方案,要求业务处理过程必须拆分成“预留业务资源”和“确认/释放消费资源”两个子过程。
TCC
Try(尝试执行阶段)
完成所有业务可执行性的检查(保障一致性),并且预留好全部需要用到的业务资源(保障隔离性)。

Confirm(确认执行阶段)
不进行任何业务检查,直接使用Try阶段准备的资源来完成业务处理。
Confirm阶段可能会重复执行,因此本阶段执行的操作需要具备幂等性。

Cancel(取消执行阶段)
释放Try阶段预留的业务资源
Cancel阶段可能会重复执行,因此本阶段执行的操作需要具备幂等性。

  • 柔性事务(SAGA)
    SAGA事务:把一个大事务分解为可以交错运行的一系列子事务集合。原本SAGA的目的是避免大事务长时间锁定数据库资源,后来才发展成将一个分布式环境中的大事务分解成一系列本地事务的设计模式。

与TCC相比,SAGA不需要为资源设计冻结状态和撤销冻结的操作,补偿操作往往要比冻结操作容易实现的多。

SAGA必须保证所有子事务都得以提交或者补偿,但SAGA系统本身也有可能会崩溃,所以他必须设计成与数据库类似的日志机制(被称为SAGA log),以保证系统恢复后可以追踪到子事务的执行情况,比如执行到哪一步或者补偿到哪一步了。
SAGA- 柔性事务(基于数据补偿)

Seata的AT模式就是基于数据补偿来代替回滚思路的

AT事务是参照了XA两段提交协议实现的,但是AT并不需要等待所有数据源都返回成功采取执行全局提交,而是通过了拦截SQL的方式,生成前后镜像,生成行锁,通过本地事务一起提交到操作的数据源中,相当于自己记录了重做和回滚日志。

如果分布式事务成功提交,那后续清理每个数据源中对应的日志数据即可;如果分布式事务需要回滚,就根据日志数据自动产生同用于补偿的"逆向SQL“。
基于数据补偿

刚性事务和柔性事务对比

刚性和柔性事务对比 一致性保障:XA > TCC = SAGA > 事务消息
业务友好性:XA > 事务消息 > SAGA > TCC
性能损耗:XA > TCC = SAGA = 事务消息

相关文章:

分布式事务

数据库事务 Atomicity 原子性 某个操作,要么全部执行完毕,要么全部回滚 Consistency 一致性 数据库中的数据全都符合现实世界的约束,则这些数据就符合一致性。 比如性别约束男or女,人名币面值不能为负数;出生地址不能…...

zk111111111111111111

Zookeeper 1 zookeeper(作为 dubbo 的注册中心): 概述: zookeper 是 一个分布式的、开源的分布式应用程序的协调服务,管理分布式应 用 作用: 配置管理,分布式锁,集群管理 2 zookeeper 的安装 (dubbo 的资料中已经整理) 3 zookeeper 的数据模型 zookeeper 是一个树形的服…...

018:Mapbox GL加载Google地图(影像瓦片图)

第018个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载google地图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共80行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xia…...

Web API 和 API 的区别编写api

编写api 自从Roy Fielding博士在2000年他的博士论文中提出(Representational State Transfer)风格的软件架构模式后,REST就基本上迅速取代了复杂而笨重的SOAP,成为Web API的标准了。 什么是Web API呢? 1. Web API 和…...

IDEA 用上这款免费 GPT4 插件,生产力爆表了

大家好,我是一航! 早前给大家分享过GPT的一些玩法,但是依旧有很多铁子没有掌握魔法的奥秘,始终没有用上;前两天,一兄台分享给我一款 IDE 插件:Bito-ChatGPT ,安装就能直接在IDE中使…...

1187.使数组严格递增 学习记录

题目描述 给你两个整数数组 arr1 和 arr2&#xff0c;返回使 arr1 严格递增所需要的最小「操作」数&#xff08;可能为 0&#xff09;。 每一步「操作」中&#xff0c;你可以分别从 arr1 和 arr2 中各选出一个索引&#xff0c;分别为 i 和 j&#xff0c;0 < i < arr1.l…...

权限控制_SpringSecurity

认证-授权 认证&#xff1a;系统提供的用于识别用户身份的功能&#xff0c;通常提供用户名和密码进行登录其实就是在进行认证&#xff0c;认证的目的是让系统知道你是谁。 授权&#xff1a;用户认证成功后&#xff0c;需要为用户授权&#xff0c;其实就是指定当前用户可以操作…...

2023年最系统的自动化测试,测试开发面试题,10k以下不建议看

鉴于现在严峻的就业形势&#xff0c;千万大学生即将出新手村&#xff0c;今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题&#xff0c;与君共勉&#xff01; 一、开场白 Q&#xff1a;简单自我介绍一下吧 Q&#xff1a;项…...

今年SMETA审核费用即将涨价

【今年SMETA审核费用即将涨价】 SMETA全称&#xff08; Sedex Members Ethical Trade Audit &#xff09;&#xff0c;即Sedex会员社会道德贸易审核&#xff0c;它是Sedex发起的一种负责任的供应链审计方法/项目。 Sedex是一个全球性的责任商业平台&#xff0c;SMETA是审核方法…...

基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

基于深度学习和生理信号的疾病筛查:个体内和个体间研究的价值与应用

一、引言 随着深度学习技术的飞速发展&#xff0c;基于生理信号的疾病筛查和诊断方法在医学领域得到了广泛应用。这些方法通常利用个体内和个体间的生理信号数据&#xff0c;通过训练深度学习模型实现疾病的自动识别和预测。本文将讨论个体内和个体间研究在这一领域的价值和应…...

现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序

目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候&#xff0c;经常遇到这个题目&#xff0c;首先从题目上看&#xff0c;就知道考察的是多线程方面知识&#xff0c;我第一次看到这个题目的时候&#xff0c;就想到了使用CountDownLatch这个计数器来实现&#xff0c…...

83.qt qml-初步学习2D粒子影响器(二)

由于QmlBook in chinese翻译过来的文字有些比较生疏难于理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 QML粒子所有类型: Qt Quick Particles QML Types | Qt Quick 6.5.0 Affector类型: Attractor QML Type | Qt Quick 6.5.…...

4.17-4.18学习总结

MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5&#xff1f; 存储一些敏感信息的时候&#xff0c;如果不进行加密会出现安全问题。 例如&#xff1a;系统登录的密码&#xff0c;如果数据库中的密码采用明文&#xff0c;一旦数据库泄…...

Spring事务

事务作用&#xff1a; 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或 业务层 保障一系列的数据库操作同成功同失败 Spring为了管理事务&#xff0c;提供了一个平台事务管理器PlatformTransactionManager commit是用来提…...

Linux新的设备或分区挂载到系统中mount使用方法

如果想将一个新的设备或分区挂载到系统中&#xff0c;可以按照以下步骤进行操作&#xff1a; 确定要挂载的设备或分区的设备名&#xff0c;例如 /dev/sdb1。 创建挂载点&#xff0c;可以在任何目录下创建一个新目录作为挂载点&#xff0c;例如 /mnt/mydevice。 sudo mkdir /mn…...

移动硬盘损坏如何恢复数据

移动硬盘一种小巧便携的存储介质&#xff0c;可用于各电脑之间交换大容量数据&#xff0c;可以随时插拔&#xff0c;进行高速传输数据。但有好也有坏&#xff0c;在我们使用中也会出现一些移动硬盘损坏故障&#xff0c;比如说提示格式化、硬盘分区丢失、误格式化、文件误删除等…...

Material Design:为你的 Android 应用提供精美的 UI 体验

Material Design&#xff1a;为你的 Android 应用提供精美的 UI 体验 介绍 Material Design 概念&#xff1a;介绍 Material Design 是 Google 推出的一种设计语言&#xff0c;用于创建现代、美观、直观且一致的用户界面。解释 Material Design 的基本原则&#xff0c;包括材料…...

springboot+vue学生毕业离校系统(源码+说明文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生毕业离校系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…...

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?

目录 一、ContentResolver基本用法 如何查询&#xff1f; 如何向表中添加一条数据&#xff1f; 如何更新这条新添加的数据&#xff1f; 如何删除这条数据&#xff1f; 二、读取系统联系人 要想你的APP访问其他应用程序的数据&#xff0c;需要使用内容提供器&#xff0c;下面使…...

【100个 Unity实用技能】 | InputField输入框组件实现输入限制,只能输入中文或特殊字符等

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…...

倍数+路径之谜

倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中&#xff0c;有多少个…...

【Unity渲染】URP透明物体自身渲染穿插异常问题

背景&#xff1a; 对于URP中的某个物体&#xff0c;我们如果希望他正反面都可以被渲染。 通常会有两种解决方案&#xff1a; 1.将网格设置为双面网格。&#xff08;此种情况Mesh.RecalculateNormals计算结果可能会异常&#xff0c;解决可参考网格法线生成异常解决&#xff0…...

c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL

c/c:指针&#xff0c;指针定义和使用&#xff0c;指针大小4字节&#xff0c;野指针&#xff0c;空指针*pNULL 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知道的周边的会c的同学&#xf…...

CAS实现原⼦操作的三⼤问题,该如何解决?

目录 1、ABA问题 2.循环时间长开销大 3、只能保证一个共享变量的原子操作 总结&#xff1a; CAS&#xff08;Compare-and-Swap&#xff09;是一种用于实现原子操作的技术&#xff0c;但是它存在着三个主要的问题&#xff1a;ABA问题、循环时间长开销大、只能保证一个共享变…...

Linux Shell 实现一键部署二进制go+caddy+filebrowser

filebrowser filebrowser 是一个使用go语言编写的软件&#xff0c;功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件&#xff0c;或者是添加删除文件&#xff0c;甚至可以分享文件&#xff0c;是一个很棒的文件管理器&#xff0c;你甚至可以当成一个网盘来使用。…...

无人机巡检智能一体化解决方案

随着无人机技术的不断发展&#xff0c;无人机应用领域已经越来越生活化&#xff0c;其产品不仅在军事、商业等领域得到了广泛应用&#xff0c;也在普通人的生活中得到了广泛应用。无人机的自动巡检是无人机应用的一个重要方向&#xff0c;具有广阔的发展前景&#xff0c;本文将…...

2023-2029全球粘结剂喷射技术行业调研及趋势分析报告

2022年全球粘结剂喷射技术市场规模约5.8亿元&#xff0c;2018-2022年年复合增长率CAGR约为 %&#xff0c;预计未来将持续保持平稳增长的态势&#xff0c;到2029年市场规模将接近12亿元&#xff0c;未来六年CAGR为11.3%。 本文调研和分析全球粘结剂喷射技术发展现状及未来趋势&a…...

Python每日一练(20230420)

目录 1. 数组逐位判断 &#x1f31f; 2. 交错字符串 &#x1f31f;&#x1f31f; 3. 二进制求和 &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 数组逐位判断 比如…...

【社区图书馆】读《悲惨世界》有感

文章目录 故事简介经典重现价值取向我的思想 故事简介 《悲惨世界》是一部充满了悲剧的小说&#xff0c;故事首先由教堂展开&#xff0c;然后主要围绕着主人公冉阿让进行一系列的生动形象的描写&#xff0c;讲述了冉阿让悲惨的一生。 主人公冉阿让是一个诚实、善良的工人&…...