架构03-事务处理

零、文章目录

架构03-事务处理

1、本地事务实现原子性和持久性

(1)事务类型
  • **本地事务:**单个服务、单个数据源
  • **全局事务:**单个服务、多个数据源
  • **共享事务:**多个服务、单个数据源
  • **分布式事务:**多个服务、多个数据源
(2)事务意义
  • **一致性:**保证系统中的数据正确,不同数据间不会产生矛盾。
  • ACID特性:
    • **原子性(Atomicity):**多个对数据的修改要么同时成功,要么一起被撤销。
    • **隔离性(Isolation):**不同业务处理过程中的数据读写互相独立,不会彼此影响。
    • **持久性(Durability):**成功提交的数据修改能够正确地被持久化,不丢失数据。
(3)事务场景
  • **事务的概念:**最初源于数据库,但现代信息系统中,包括数据库、缓存、事务内存、消息、队列、对象文件存储等场景都可能涉及事务处理。
  • **复杂性:**单个服务使用单个数据源时较容易实现一致性,但涉及多个数据源或多个服务时变得困难。
(4)本地事务
  • **定义:**仅操作特定单一事务资源的事务,不需要全局事务管理器进行协调。
  • **适用场景:**单个服务使用单个数据源。
  • 实现原理
    • **原子性:**保证事务的多个操作要么都生效,要么都不生效。
    • **持久性:**保证事务生效后,修改的内容不会因任何原因被撤销或丢失。
(5)实现方法
  • Commit Logging:
    • **原理:**先将修改数据的操作记录到日志中,日志记录成功后,再对数据进行修改。
    • **优点:**简单清晰,易于实现。
    • **缺点:**性能较低,不允许在事务提交前写入变动数据。
  • Write-Ahead Logging:
    • **原理:**允许在事务提交前写入变动数据,通过 Undo Log 和 Redo Log 来实现崩溃恢复。
    • 步骤:
      • **分析阶段(Analysis):**扫描日志,找出待恢复的事务集合。
      • **重做阶段(Redo):**重演历史,将包含 Commit Record 的日志写入磁盘。
      • **回滚阶段(Undo):**根据 Undo Log 回滚未提交的事务。
    • **优点:**性能较高,允许提前写入数据。
    • **缺点:**实现复杂,涉及多种日志类型和复杂的恢复机制。
(6)ARIES理论
  • **定义:**基于语义的恢复与隔离算法,现代主流关系型数据库在事务实现上深受其影响。
  • **核心思想:**通过 Write-Ahead Logging 实现高效且严谨的日志记录与故障恢复。
  • 组合策略:
    • **FORCE:**事务提交后,要求变动数据必须同时完成写入。
    • **STEAL:**事务提交前,允许变动数据提前写入。
    • **最佳组合:**NO-FORCE + STEAL,性能最高但实现复杂。

2、数据库事务隔离性实现原理

(1)隔离性与并发
  • **定义:**隔离性保证每个事务各自读、写的数据互相独立,不会彼此影响。
  • **并发关系:**如果没有并发,所有事务全都是串行的,不需要任何隔离。但在现实中,并发是不可避免的,因此需要通过加锁等方式实现串行的数据访问。
(2)数据库提供的三种锁
  • 写锁(Write Lock / X-Lock)
    • 只有持有写锁的事务才能对数据进行写入操作。
    • 数据加持着写锁时,其他事务不能写入数据,也不能施加读锁。
  • 读锁(Read Lock / S-Lock)
    • 多个事务可以对同一个数据添加多个读锁。
    • 数据被加上读锁后不能被加上写锁,其他事务不能对该数据进行写入,但仍然可以读取。
    • 持有读锁的事务可以将读锁升级为写锁,然后写入数据。
  • 范围锁(Range Lock)
    • 对某个范围直接加排他锁,在这个范围内的数据不能被读取,也不能被写入。
    • 范围锁不仅禁止修改已有数据,还禁止在该范围内新增或删除任何数据。
(3)本地事务的四种隔离级别
  • 可串行化(Serializable)
    • **隔离强度:**最高
    • **实现方式:**对事务所有读、写的数据全都加上读锁、写锁和范围锁。
    • **性能影响:**并发能力最低,吞吐量最低。
  • 可重复读(Repeatable Read)
    • **隔离强度:**次高
    • **实现方式:**对事务所涉及的数据加读锁和写锁,持续到事务结束,但不加范围锁。
    • **问题:**幻读问题(Phantom Reads),即在事务执行过程中,两个完全相同的范围查询得到了不同的结果集。
  • 读已提交(Read Committed)
    • **隔离强度:**中等
    • **实现方式:**对事务涉及的数据加的写锁持续到事务结束,但读锁在查询操作完成后立即释放。
    • **问题:**不可重复读问题(Non-Repeatable Reads),即在事务执行过程中,对同一行数据的两次查询得到了不同的结果。
  • 读未提交(Read Uncommitted)
    • **隔离强度:**最低
    • **实现方式:**对事务涉及的数据只加写锁,持续到事务结束,完全不加读锁。
    • **问题:**脏读问题(Dirty Reads),即在事务执行过程中,一个事务读取到了另一个事务未提交的数据。
(4)多版本并发控制(MVCC)
  • 基础原理:
    • **版本管理:**对数据库的任何修改都不会直接覆盖之前的数据,而是产生一个新版副本与老版本共存。
    • **版本字段:**每一行记录都有两个看不见的字段:CREATE_VERSION 和 DELETE_VERSION,记录事务 ID。
    • 读取策略:
      • 可重复读:总是读取 CREATE_VERSION 小于或等于当前事务 ID 的记录,取最新版本。
      • 读已提交:总是取最新的版本即可,即最近被 Commit 的那个版本的数据。
  • **适用场景:**主要针对“读 + 写”场景的优化,如果是“写 + 写”场景,仍需加锁。
(5)乐观加锁与悲观加锁
  • **悲观加锁:**认为事务之间数据存在竞争是普遍情况,因此一开始就加锁。
  • **乐观加锁:**认为事务之间数据存在竞争是偶然情况,因此不一开始就加锁,而是出现竞争时再采取补救措施。
  • **性能影响:**竞争剧烈时,乐观锁可能更慢。

3、全局事务和共享事务

(1)全局事务
  • **定义:**全局事务(Global Transactions)适用于单个服务使用多个数据源的场景,是一种在分布式环境中追求强一致性的事务处理方案。
  • 实现方式:
    • XA 协议:
      • **定义:**1991年X/Open组织提出的事务处理框架,定义了全局事务管理器(Transaction Manager)和局部资源管理器(Resource Manager)之间的通信接口。
      • 核心组件:
        • 事务管理器:协调全局事务。
        • 资源管理器:驱动本地事务。
    • JTA(Java Transaction API):
      • javax.transaction.TransactionManager:用于容器事务管理。
      • javax.transaction.UserTransaction:用于手动开启、提交和回滚事务。
      • javax.transaction.xa.XAResource:资源定义接口,实现该接口的资源支持JTA。
  • 两段式提交(2PC):
    • 阶段:
      • **准备阶段:**协调者询问参与者是否准备好提交。
      • **提交阶段:**协调者根据参与者回复决定提交或回滚。
    • **优点:**保证了事务的一致性。
    • 缺点:
      • **单点问题:**协调者宕机会影响所有参与者。
      • **性能问题:**多次远程调用和数据持久化导致性能较差。
      • **一致性风险:**网络不稳定可能导致数据不一致。
  • 三段式提交(3PC):
    • 阶段:
      • CanCommit:协调者询问参与者事务是否可以完成。
      • PreCommit:参与者准备提交。
      • DoCommit:协调者发送提交指令。
    • **优点:**改善了单点问题和回滚时的性能问题。
    • **缺点:**并未解决一致性风险问题,甚至可能增加一致性风险。
(2)共享事务
  • **定义:**共享事务(Share Transactions)是指多个服务共用同一个数据源。
  • 实现方式:
    • **数据源与数据库的区别:**数据源是提供数据的逻辑设备,不一定与物理设备一一对应。
    • **场景:**多个微服务共用同一个数据库。
    • 方案:
      • **共享数据库连接:**同一应用进程内的不同持久化工具共享数据库连接。
      • **交易服务器:**新增中间角色,各服务通过交易服务器与数据库交互。
      • **消息队列:**使用消息队列服务器代替交易服务器,通过消息驱动更新数据库。
  • 局限性:
    • **性能问题:**数据库是系统中的瓶颈,难以扩展。
    • **伪需求:**实际应用中较少使用,更多是理论上的可行性。

4、分布式事务

(1)分布式事务的挑战
  • 分布式事务的复杂性
    • **DTP 模型:**分布式事务相对于数据源而言,不涉及服务
    • **分布式服务环境下的事务处理机制:**涉及多个服务同时访问多个数据源
  • **事例场景:**Fenix’s Bookstore
    • **服务拓扑:**账号、商家、仓库服务集群
    • CAP 问题:
      • **一致性问题:**数据未及时同步导致错误交易
      • **可用性问题:**数据同步过程中暂停服务
      • **分区容忍性问题:**网络分区导致服务不正确
  • CAP 取舍
    • **CP 系统:**放弃可用性,保证一致性和分区容忍性
      • **RDBMS 集群:**通过共享磁盘避免网络分区
      • **HBase:**RegionServer 宕机导致数据离线
    • **AP 系统:**放弃一致性,保证可用性和分区容忍性
      • **NoSQL 库:**节点独立提供服务,可能出现不一致数据
      • **Redis 集群:**节点独立提供服务,可能出现不同数据
(2)CAP 理论与 ACID 原则的矛盾
  • CAP 理论
    • **一致性(C):**所有节点数据一致
    • **可用性(A):**系统不间断提供服务
    • **分区容忍性(P):**部分节点失联时系统仍能正确提供服务
  • ACID 原则
    • **原子性(A):**事务中的所有操作要么全部成功,要么全部失败
    • **一致性(C):**事务执行前后,数据库保持一致状态
    • **隔离性(I):**并发事务互不干扰
    • **持久性(D):**事务一旦提交,结果永久保存
  • 矛盾点
    • **CAP 理论:**分布式系统中最多只能同时满足两个特性
    • **ACID 原则:**要求事务具有强一致性
(3)可靠事件队列
  • 弱一致性
    • **定义:**牺牲一致性,追求可用性和分区容忍性
    • **最终一致性:**数据在一段时间内未被修改,最终达到一致状态
  • 实现方式:可靠事件队列
    • **BASE 模型:**基本可用、软状态、最终一致性
    • 操作时序:
      • 用户发送交易请求
      • 系统评估操作顺序
      • 账户服务扣款并写入消息表
      • 消息服务轮询消息表,发送消息
      • 服务节点处理消息并返回结果
      • 消息服务重试直至成功
    • 关键点
      • **幂等性:**消息重复发送不会导致重复操作
      • **最大努力交付:**通过持续重试保证可靠性
(4)TCC (Try-Confirm-Cancel)
  • 特点:
    • **强隔离性:**通过Try阶段预留资源,确保事务的隔离性。
    • **业务侵入性:**需要将业务逻辑拆分为Try、Confirm和Cancel三个阶段,对业务代码有较高侵入性。
    • **高性能:**在业务执行时只操作预留资源,减少锁和资源争用,具有较高的性能潜力。
  • 实现过程:

- **Try阶段:*** 检查业务可行性。* 预留业务资源。
- **Confirm阶段:*** 使用Try阶段准备的资源完成业务处理。* 满足幂等性,可能重复执行。
- **Cancel阶段:*** 释放Try阶段预留的业务资源。* 满足幂等性,可能重复执行。
  • 适用场景:
    • **强隔离性要求:**如在线书店的库存管理,需要避免超售问题。
    • **高性能要求:**在业务逻辑允许的情况下,可以通过TCC提高系统吞吐量。
(5)SAGA
  • 特点:
    • **灵活性:**将大事务拆分为多个小事务,每个小事务都有对应的补偿操作。
    • **低业务侵入性:**不需要为资源设计冻结状态和撤销冻结的操作,补偿操作相对容易实现。
    • **最终一致性:**通过正向恢复或反向恢复策略,确保最终一致性。
  • 实现过程:
    • 子事务拆分:
      • 将大事务T拆分为多个子事务T1, T2, …, Tn。
    • 补偿操作设计:
      • 为每个子事务Ti设计对应的补偿操作Ci。
      • 满足幂等性和交换律。
    • 恢复策略:
      • **正向恢复:**如果Ti提交失败,重试直至成功。
      • **反向恢复:**如果Ti提交失败,执行Ci补偿操作直至成功。
  • 适用场景:
    • **灵活性要求高:**如银行转账场景,无法要求银行冻结款项。
    • **最终一致性要求:**在业务逻辑允许的情况下,可以通过SAGA确保最终一致性。
(6)AT事务(异步提交模式)
  • 特点:
    • **异步提交:**每个数据源单独提交,立即释放锁和资源,提高系统吞吐量。
    • **牺牲隔离性:**可能产生脏写和脏读,需要通过全局锁机制来避免。
    • **自动补偿:**通过保存SQL快照,自动生成逆向SQL进行补偿。
  • 实现过程:
    • SQL拦截:
      • 自动拦截所有SQL,保存修改前后结果的快照,生成行锁。
    • 本地事务提交:
      • 通过本地事务提交快照和行锁。
    • 分布式事务提交/回滚:
      • 成功提交时,清理日志数据。
      • 需要回滚时,根据日志数据生成逆向SQL进行补偿。
  • 适用场景:
    • **高吞吐量要求:**在业务逻辑允许的情况下,通过异步提交提高系统吞吐量。
    • **最终一致性要求:**在可以接受一定程度的脏写和脏读的情况下,确保最终一致性。

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

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

相关文章

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道,电子商务巨头亚马逊(AMZN)已开发出一种新的生成式人工智能(AI),不仅能处理文本,还能处理图片和视频,从而减少对人工智能初创公司Anthropic的依赖…

Spring Boot教程之十二: Spring – RestTemplate

Spring – RestTemplate 由于流量大和快速访问服务,REST API越来越受欢迎。REST 不是一种协议或标准方式,而是一组架构约束。它也被称为 RESTful API 或 Web API。当发出客户端请求时,它只是通过 HTTP 将资源状态的表示传输给请求者或端点。传…

通过 JNI 实现 Java 与 Rust 的 Channel 消息传递

做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集,不是子女的前传,更不是朋友的外篇。对待生命你不妨再大胆一点,因为你好歹要失去它。如果这世上真有奇迹,那只是努力的另一个名字”。 一、crossbeam_channel 参考 cr…

CSS笔记(一)炉石传说卡牌设计1

目标 我要通过html实现一张炉石传说的卡牌设计 问题 其中必须就要考虑到各个元素的摆放,形状的调整来达到满意的效果。通过这个联系来熟悉一下CSS的基本操作。 1️⃣ 基本概念 在CSS里面有行元素,块元素,内联元素,常见的行元…

GAMES101:现代计算机图形学入门-笔记-09

久违的101图形学回归咯 今天的话题应该是比较轻松的:聊一聊在渲染中比较先进的topics Advanced Light Transport 首先是介绍一系列比较先进的光线传播方法,有无偏的如BDPT(双向路径追踪),MLT(梅特罗波利斯…

Oracle 数据库 IDENTITY 列

IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列,是由于其支持ANSI SQL 关键字 IDENTITY,其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的,毕竟MyQL已经有 AUTO_INCREMENT列,而SQL Server也已经有IDENT…

前端学习笔记之文件下载(1.0)

因为要用到这样一个场景,需要下载系统的使用教程,所以在前端项目中就提供了一个能够下载系统教程的一个按钮,供使用者进行下载。 所以就试着写一下这个功能,以一个demo的形式进行演示,在学习的过程中也发现了中文路径…

【阅读记录-章节4】Build a Large Language Model (From Scratch)

文章目录 4. Implementing a GPT model from scratch to generate text4.1 Coding an LLM architecture4.1.1 配置小型 GPT-2 模型4.1.2 DummyGPTModel代码示例4.1.3 准备输入数据并初始化 GPT 模型4.1.4 初始化并运行 GPT 模型 4.2 Normalizing activations with layer normal…

Python PDF转JPG图片小工具

Python PDF转JPG图片小工具 1.简介 将单个pdf装换成jpg格式图片 Tip: 1、软件窗口默认最前端,不支持调整窗口大小; 2、可通过按钮选择PDF文件,也可以直接拖拽文件到窗口; 3、转换质量有5个档位,(0.25&a…

使用SOAtest进行功能回归测试

持续集成是将所有开发人员的工作副本合并到共享的主线上。这个过程使软件开发对开发人员来说更容易访问、更快、风险更小。 阅读这篇文章,让我们了解如何配置Parasoft SOAtest作为持续集成过程的一部分,来执行功能测试和回归测试。我们将介绍如何使用主…

ais_server 学习笔记

ais_server 学习笔记 一前序二、ais init1、时序图如下2. 初始化一共分为以下几个重要步骤:2.1.1、在ais_server中启动main函数,然后创建AisEngine,接着初始化AisEngine2.1.2、解析/var/camera_config.xml 文件,获取相关配置参数。…

L1G3000 任务-浦语提示词工程

基础任务 (完成此任务即完成闯关) 背景问题:近期相关研究指出,在处理特定文本分析任务时,语言模型的表现有时会遇到挑战,例如在分析单词内部的具体字母数量时可能会出现错误。任务要求:利用对提示词的精确设计&#xf…

Unity之一键创建自定义Package包

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之一键创建自定义Package包 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! …

python的Flask框架使用

python的Flask框架使用 python环境搭建conda安装python自带的虚拟环境:venv python环境搭建 官网地址 点击downloads 选择你需要的版本,我这里使用的3.12.6 选择Windows installer (64-bit) 选择自定义安装,勾选以管理员权限安装&#xff0…

网络原理(一)—— http

什么是 http http 是一个应用层协议,全称为“超文本传输协议”。 http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0 http3 是…

103.【C语言】数据结构之建堆的时间复杂度分析

1.向下调整的时间复杂度 推导 设树高为h 发现如下规律 按最坏的情况考虑(即调整次数最多) 第1层,有个节点,最多向上调整h-1次 第2层,有个节点,最多向上调整h-2次 第3层,有个节点,最多向上调整h-3次 第4层,有个节点,最多向上调整h-4次 ... 第h-1层,有个节点,最多向上调整1次 第…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言:数据的宝藏 在这个信息爆炸的时代,数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说,1688上的商品详情就是那些闪闪发光的金子。今天,我们将化身为数据的海盗,用Python这把锋利的剑&#xff0…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数: lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数: lambda 1)语法: lambda arg1, arg2, …, argN : expression using arg 2) lambda是一个表达式,而不是一个语…