分布式事务
数据库事务
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最主要的两个接口如下:
- 事务管理器接口
- 满足XA规范的资源定义接口
- 刚性事务(2PC)
为了保证整个事务的一致性,XA将事务提交拆分成两阶段,即:二段式提交协议,交互时序示意图如下所示:
- 刚性事务(3PC)
为了缓解2PC中协调者的单点问题和准备阶段的性能问题,后续发展出了“三段式提交”,即: 3PC协议,交互时序示意图如下所示:
柔性事务(可靠事务队列)
以快捷支付为例,当用户下单的时候,自动就进行了支付扣款操作。那么创建订单、扣减库存和支付扣款这三个操作就应该是一个原子性的操作。那么如果我们采取可靠时间队列的方式,则流程如下图所示:
- 柔性事务(TCC)
TCC 是 Try-Confirm-Cancel的缩写,是常见的分布式事务机制
在具体实现上,TCC较为繁琐,他是一种业务侵入式较强的事务方案,要求业务处理过程必须拆分成“预留业务资源”和“确认/释放消费资源”两个子过程。
Try(尝试执行阶段)
完成所有业务可执行性的检查(保障一致性),并且预留好全部需要用到的业务资源(保障隔离性)。
Confirm(确认执行阶段)
不进行任何业务检查,直接使用Try阶段准备的资源来完成业务处理。
Confirm阶段可能会重复执行,因此本阶段执行的操作需要具备幂等性。
Cancel(取消执行阶段)
释放Try阶段预留的业务资源
Cancel阶段可能会重复执行,因此本阶段执行的操作需要具备幂等性。
- 柔性事务(SAGA)
SAGA事务:把一个大事务分解为可以交错运行的一系列子事务集合。原本SAGA的目的是避免大事务长时间锁定数据库资源,后来才发展成将一个分布式环境中的大事务分解成一系列本地事务的设计模式。
与TCC相比,SAGA不需要为资源设计冻结状态和撤销冻结的操作,补偿操作往往要比冻结操作容易实现的多。
SAGA必须保证所有子事务都得以提交或者补偿,但SAGA系统本身也有可能会崩溃,所以他必须设计成与数据库类似的日志机制(被称为SAGA log),以保证系统恢复后可以追踪到子事务的执行情况,比如执行到哪一步或者补偿到哪一步了。
- 柔性事务(基于数据补偿)
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,返回使 arr1 严格递增所需要的最小「操作」数(可能为 0)。 每一步「操作」中,你可以分别从 arr1 和 arr2 中各选出一个索引,分别为 i 和 j,0 < i < arr1.l…...

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

2023年最系统的自动化测试,测试开发面试题,10k以下不建议看
鉴于现在严峻的就业形势,千万大学生即将出新手村,今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题,与君共勉! 一、开场白 Q:简单自我介绍一下吧 Q:项…...

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

基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

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

现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序
目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候,经常遇到这个题目,首先从题目上看,就知道考察的是多线程方面知识,我第一次看到这个题目的时候,就想到了使用CountDownLatch这个计数器来实现,…...

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? 存储一些敏感信息的时候,如果不进行加密会出现安全问题。 例如:系统登录的密码,如果数据库中的密码采用明文,一旦数据库泄…...

Spring事务
事务作用: 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或 业务层 保障一系列的数据库操作同成功同失败 Spring为了管理事务,提供了一个平台事务管理器PlatformTransactionManager commit是用来提…...
Linux新的设备或分区挂载到系统中mount使用方法
如果想将一个新的设备或分区挂载到系统中,可以按照以下步骤进行操作: 确定要挂载的设备或分区的设备名,例如 /dev/sdb1。 创建挂载点,可以在任何目录下创建一个新目录作为挂载点,例如 /mnt/mydevice。 sudo mkdir /mn…...
移动硬盘损坏如何恢复数据
移动硬盘一种小巧便携的存储介质,可用于各电脑之间交换大容量数据,可以随时插拔,进行高速传输数据。但有好也有坏,在我们使用中也会出现一些移动硬盘损坏故障,比如说提示格式化、硬盘分区丢失、误格式化、文件误删除等…...

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

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

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?
目录 一、ContentResolver基本用法 如何查询? 如何向表中添加一条数据? 如何更新这条新添加的数据? 如何删除这条数据? 二、读取系统联系人 要想你的APP访问其他应用程序的数据,需要使用内容提供器,下面使…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...