当前位置: 首页 > 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;下面使…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...