事务(本地事务与分布式事务)

news2024/11/24 3:09:53

事务

  • 1 本地事务
    • 1.1 事务的特性
    • 1.2 事务的隔离级别
    • 1.3 事务的传播属性
  • 2 分布式事务
    • 2.1 分布式事务基础
      • 2.1.1 CAP定理
      • 2.1.2 BASE定理
    • 2.2 分布式事务的解决方案
      • 2.2.1 两阶段提交(2PC)
      • 2.2.2 TCC补偿式事务
      • 2.2.3 消息事务+最终一致性

1 本地事务

1.1 事务的特性

事务的概念:事务是逻辑上一组操作,组成这组操作各个逻辑单元,要么一起成功,要么一起失败。

事务的四个特性(ACID):
(1)原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。
(2)一致性(consistency):一致指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。
(3)隔离性(isolation):在应用程序实际运行过程中,事务往往是并发执行的,所以很有可能有许多事务同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。隔离性原则要求多个事务在并发执行过程中不会互相干扰
(4)持久性(durability):持久性原则要求事务执行完成后,对数据的修改永久的保存下来,不会因各种系统错误或其他意外情况而受到影响。通常情况下,事务对数据的修改应该被写入到持久化存储器中。

1.2 事务的隔离级别

事务并发引起一些读的问题:

  • 脏读 一个事务可以读取另一个事务未提交的数据
  • 不可重复读 一个事务可以读取另一个事务已提交的数据 单条记录前后不匹配
  • 虚读(幻读) 一个事务可以读取另一个事务已提交的数据 读取的数据前后多了点或者少了点

并发写:使用mysql默认的锁机制(独占锁)

解决读问题:设置事务隔离级别

  • read uncommitted(0)
  • read committed(2)
  • repeatable read(4)
  • Serializable(8)

隔离级别越高,性能越低。

imagepng
一般情况下:脏读是不可允许的,不可重复读和幻读是可以被适当允许的。

1.3 事务的传播属性

Spring中的7个事务传播行为:

事务行为说明
PROPAGATION_REQUIRED支持当前事务,假设当前没有事务。就新建一个事务
PROPAGATION_SUPPORTS支持当前事务,假设当前没有事务,就以非事务方式运行
PROPAGATION_MANDATORY支持当前事务,假设当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW新建事务,假设当前存在事务。把当前事务挂起
PROPAGATION_NOT_SUPPORTED以非事务方式运行操作。假设当前存在事务,就把当前事务挂起
PROPAGATION_NEVER以非事务方式运行,假设当前存在事务,则抛出异常
PROPAGATION_NESTED如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

2 分布式事务

2.1 分布式事务基础

2.1.1 CAP定理

分布式存储系统的CAP原理(分布式系统的三个指标):
(1)Consistency(一致性):在分布式系统中的所有数据备份,在同一时刻是否同样的值。对于数据分布在不同节点上的数据来说,如果在某个节点更新了数据,那么在其他节点如果都能读取到这个最新的数据,那么就称为强一致,如果有某个节点没有读取到,那就是分布式不一致。

(2) Availability(可用性):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(要求数据需要备份)

(3)Partition tolerance(分区容忍性):大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。

  CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们无法避免的。所以我们只能在一致性和可用性之间进行权衡,没有系统能同时保证这三点。要么选择CP、要么选择AP。
imagepng

2.1.2 BASE定理

  BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的结论,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性(Strong consistency),但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性(Eventual consistency)。接下来看看BASE中的三要素:

(1)Basically Available(基本可用)基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供降级服务。这就是损失部分可用性的体现。

(2)Soft state(软状态)软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布式存储中一般一份数据至少会有三个副本,允许不同节点间副本同步的延时就是软状态的体现。mysql replication的异步复制也是一种体现。

(3)Eventually consistent(最终一致性)最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

BASE模型是传统ACID模型的反面,不同于ACID,BASE强调牺牲高一致性,从而获得可用性,数据允许在一段时间内的不一致,只要保证最终一致就可以了

2.2 分布式事务的解决方案

主流的解决方案如下:
(1) 基于XA协议的两阶段提交(2PC)
(2)柔性事务-TCC事务
(3)柔性事务-最终一致性

2.2.1 两阶段提交(2PC)

  2PC即两阶段提交协议,是将整个事务流程分为两个阶段,准备阶段(Prepare phase)、提交阶段(commit phase),2是指两个阶段,P是指准备阶段,C是指提交阶段。
imagepng

第一阶段: 事务协调器要求每个涉及到事务的数据库预提交(precommit)此操作,并反映是否可以提交.

第二阶段: 事务协调器要求每个数据库提交数据。

其中,如果有任何一个数据库否决此次提交,那么所有数据库都会被要求回滚它们在此事务中的那部分信息。

目前主流数据库均支持2PC【2 Phase Commit】

XA 是一个两阶段提交协议,又叫做 XA Transactions。

  总的来说,XA协议比较简单,而且一旦商业数据库实现了XA协议,使用分布式事务的成本也比较低。但是,XA也有致命的缺点,那就是性能不理想,特别是在交易下单链路,往往并发量很高,XA无法满足高并发场景。

(1) 两阶段提交涉及多次节点间的网络通信,通信时间太长!
(2)事务时间相对于变长了,锁定的资源的时间也变长了,造成资源等待时间也增加好多。
(3) XA目前在商业数据库支持的比较理想,在mysql数据库中支持的不太理想,mysql的XA实现,没有记录prepare阶段日志,主备切换会导致主库与备库数据不一致。许多nosql也没有支持XA,这让XA的应用场景变得非常狭隘。

2.2.2 TCC补偿式事务

TCC 是一种编程式分布式事务解决方案。

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。TCC模式要求从服务提供三个接口:Try、Confirm、Cancel。

  • Try: 主要是对业务系统做检测及资源预留
  • Confirm: 真正执行业务,不作任何业务检查;只使用Try阶段预留的业务资源;Confirm操作满足幂等性。
  • Cancel :释放Try阶段预留的业务资源;Cancel操作满足幂等性。

整个TCC业务分成两个阶段完成:
imagepng

第一阶段: 主业务服务分别调用所有从业务的try操作,并在活动管理器中登记所有从业务服务。当所有从业务服务的try操作都调用成功或者某个从业务服务的try操作失败,进入第二阶段。

第二阶段: 活动管理器根据第一阶段的执行结果来执行confirm或cancel操作。如果第一阶段所有try操作都成功,则活动管理器调用所有从业务活动的confirm操作。否则调用所有从业务服务的cancel操作。

缺点:

  • Canfirm和Cancel的幂等性很难保证。
  • 这种方式缺点比较多,通常在复杂场景下是不推荐使用的,除非是非常简单的场景,非常容易提供回滚Cancel,而且依赖的服务也非常少的情况。
  • 这种实现方式会造成代码量庞大,耦合性高。而且非常有局限性,因为有很多的业务是无法很简单的实现回滚的,如果串行的服务很多,回滚的成本实在太高。

2.2.3 消息事务+最终一致性

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

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

适用于高并发最终一致
低并发基本一致:二阶段提交
高并发强一致:没有解决方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

观测云产品更新 | 数据转发、监控器告警策略等优化

数据转发 数据查询时间组件优化,支持选择多个日期,并可以自定义开始时间和结束时间,时间精确到小时。 监控器 > 告警策略优化 1、「通知配置」逻辑调整为:针对单个异常等级配置通知单个或多个对象告警通知。 2、「恢复通知」…

Qt5多线程<12>

1.多线程的简单实现 <1> 在头文件threaddlg.h声明用于界面显示所需的控件,其代码如下: #ifndef THREADDLG_H #define THREADDLG_H#include <QDialog> #include <QPushButton> #include "workthread.h" #define MAXSIZE 5class ThreadDlg : publ…

redis数据倾斜如何解决

Redis数据倾斜主要是由于数据访问热点导致的&#xff0c;通常在执行事务操作或范围查询时发生。这会导致大量数据集中在某个实例上&#xff0c;使得集群负载不均衡。以下是一些解决Redis数据倾斜的方法&#xff1a; 避免在同一个键值对上保存过多的数据。可以将大的键值对拆分…

辐射骚扰整改思路及方法:对共模电流的影响?|深圳比创达电子EMC

某产品首次EMC测试时&#xff0c;辐射、静电、浪涌均失败。本篇文章就“原理探究&#xff1a;对共模电流的影响”问题进行详细讨论。 现在来研究左侧的磁场分布情况。分别对两根导线使用右手螺旋定则可以发现&#xff0c;两根导线的磁场均为顺时针方向&#xff0c;即磁场是互相…

合成数据在金融服务中的应用

人工智能在金融服务中有着广泛的应用&#xff0c;从流程自动化到聊天机器人和欺诈检测。据估计&#xff0c;到 447 年&#xff0c;银行从人工智能应用中节省的潜在成本总额将达到 2023 亿美元。 但是&#xff0c;其中一些应用程序有其局限性&#xff0c;因为财务数据是最敏感和…

Altium Designer学习笔记1

一、新建项目和文件&#xff1a; 1、新建Project项目&#xff1b; 2、新建原理图文件&#xff1b; 3、新建PCB项目&#xff1b; 在工程文件上点击右键&#xff0c;保存为&#xff0c;可以依次保存三个文件。选择需要保存的路径&#xff0c;新建文件夹。 依次是原理图文件、…

滑动变阻器的调节方法有哪些?

滑动变阻器是一种可以改变电阻值的电子元件&#xff0c;广泛应用于各种电子设备和电路中。其调节方法主要有以下几种&#xff1a; 1. 手动调节&#xff1a;这是最常见的调节方式&#xff0c;通过直接旋转滑动变阻器的旋钮&#xff0c;改变电阻丝在电路中的有效长度&#xff0c;…

Java带可视化数据大屏AI智慧工地源码

智慧工地管理系统是面向建筑工程施工企业提供的工地智能交互平台&#xff0c;基于云计算、物联网、人工智能等技术的应用&#xff0c;对现场人员、材料、机械、质量、安全等进行高效管控&#xff0c;以实现项目管理人员对现场的实时把控、及时预警、精准决策&#xff0c;从而为…

2023网络钓鱼状况报告:ChatGPT等工具致网络钓鱼电子邮件数量激增1265%

近日&#xff0c;SlashNext发布了《2023年网络钓鱼状况报告》&#xff0c;报告显示&#xff1a;自ChatGPT于2022年11月推出以来&#xff0c;网络钓鱼电子邮件数量激增1265%&#xff0c;这标志着网络犯罪依托于人工智能进入了一个新的时代。 该报告深入分析了2022年第四季度至2…

干货 | 移动端使用OpenGL转场特效的音视频合成应用

作者简介 jzg&#xff0c;携程资深前端开发工程师&#xff0c;专注Android开发&#xff1b; zx&#xff0c;携程高级前端开发工程师&#xff0c;专注iOS开发&#xff1b; zcc&#xff0c;携程资深前端开发工程师&#xff0c;专注iOS开发。 前言 近年来短视频的火爆&#xff0c;…

无线测温系统在电厂的必要性,保障电力系统稳定运行

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;采集关键电力设备接电的实时温度&#xff0c;克服有线温度监测系统存在的诸如线路多&#xff0c;布线复杂&#xff0c;维护困难等不足&#xff0c;将无线无源传感器与Zigbee无线通信技术相结合&#xff0c;将物联网技…

Python中的Socket编程

目录 一、概述 二、Socket的基本概念 三、Python中的Socket编程 四、Socket的高级功能 1、多路复用&#xff08;multiplexing&#xff09;&#xff1a; 2、非阻塞式IO&#xff1a; 3、SSL加密&#xff1a; 4、服务端编程&#xff1a; 五、Socket编程的常见问题及解决方…

计算机考研精炼1000题:笔试面试必备攻略

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 ⭐️ 好书推荐 计算机考…

亚马逊云科技Zero ETL集成全面可用,可运行近乎实时的分析和机器学习

亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian曾指出&#xff1a;“数据是应用、流程和商业决策的核心。”如今&#xff0c;客户常用的数据传输模式是建立从Amazon Aurora到Amazon Redshift的数据管道。这些解决方案能够帮助客户获得新的见解&#x…

案例研究:利用合成数据提高对象检测性能

通常很难提前知道是否可以在不尝试的情况下生成与真实图像足够相似的图像。但好消息是&#xff1a;尝试起来很容易&#xff01;我们将向您展示如何操作。 本指南是关于生成合成数据的系列文章的一部分。我们还提供指南&#xff0c;可让您使用以下工具生成合成数据&#xff1a;…

剖析WPF模板机制的内部实现

剖析WPF模板机制的内部实现 众所周知&#xff0c;在WPF框架中&#xff0c;Visual类是可以提供渲染&#xff08;render&#xff09;支持的最顶层的类&#xff0c;所有可视化元素&#xff08;包括UIElement、FrameworkElment、Control等&#xff09;都直接或间接继承自Visual类。…

JavaScript的大分水岭:CommonJS vs ES模块

所周知&#xff0c;JavaScript社区喜欢进行热烈的辩论。四年来&#xff0c;我们如何组织代码的问题上一直存在一个分歧——这是一个基本但令人意外地有争议的问题&#xff0c;继续将开发者分开。 这种分歧围绕着 CommonJS 和 ES 模块&#xff0c;这是两个用于划分 JavaScript代…

不用开会员就能在线编辑、管理及分享各类地理空间数据!

「四维轻云」作为一款地理空间数据云管理平台&#xff0c;具有三维模型、正射影像、激光点云、数字高程模型、人工模型和矢量数据等地理空间数据的在线管理、浏览及分享等功能&#xff0c;致力于为用户提供更加方便、快捷的地理空间数据解决方案。 一、发布、管理超大空间数据…

交易所开发搭建

在当今的数字货币市场中&#xff0c;交易所开发搭建已经成为了一个重要的领域。交易所是数字货币交易的主要场所&#xff0c;为投资者提供了安全、可靠、高效的交易服本务文。将详细介绍交易所开发搭建的整个流程&#xff0c;包括需求分析、设计、技术选型、开发、测试和上线等…

Yolov8模型训练报错:torch.cuda.OutOfMemoryError

最近在使用自己的数据训练Yolov8模型的时候遇到了很多错误&#xff0c;下面将逐一解答。 问题报错 在训练过程中红字报错&#xff1a;torch.cuda.OutOfMemoryError: CUDA out of memory. 后面还会跟着一大段报错&#xff1a; Tried to allocate XXX MiB (GPU 0; XXX GiB to…