凤凰架构之事务处理

news2024/9/28 11:18:49

目录

    • 本地事务
    • 全局事务
    • 共享事务
    • 分布式事务
      • 可靠消息队列
      • TCC事务
      • SAGA事务

本地事务

本地事务是最基础的一种事务解决方案,只适用于单个服务使用单个数据源的场景。从应用角度看,它是直接依赖于数据源本身提供的事务能力来工作的,在程序代码层面,最多只能对事务接口做一层标准化的包装(如 JDBC 接口),并不能深入参与到事务的运作过程当中,事务的开启、终止、提交、回滚、嵌套、设置隔离级别,乃至与应用代码贴近的事务传播方式,全部都要依赖底层数据源的支持才能工作,这一点与后续介绍的 XA、TCC、SAGA 等主要靠应用程序代码来实现的事务有着十分明显的区别。

本地事务:单服务单数据源
事务特性:ACID
原子性和持久性:commit Logging
write ahead Logging
隔离性:加锁
写锁:
读锁:
范围锁:锁住的是一段范围;被锁住的范围内,数据不能被修改,不能在这个范围内进行新增和删除操作,区别于一组 排他锁

事务隔离级别,从高到底分别为:
串行化:读锁,写锁和范围锁(并发度低,性能较差)
可重复读:整个事务过程中加读锁和写锁,mysql只读事务不会出现幻读,读写事务幻读问题仍然存在
读已提交:整个事务过程加写锁,读锁在查询结束后就马上释放,容易出现不可重复读的问题
读未提交:整个事务过程加写锁,但完全不加读锁,容易出现脏读问题,即两次查询读取结果不一样

幻读:它是指在事务执行过程中,两个完全相同的范围查询得到了不同的结果集。

SELECT count(1) FROM books WHERE price < 100					/* 时间顺序:1,事务: T1 */
INSERT INTO books(name,price) VALUES ('深入理解Java虚拟机',90)	/* 时间顺序:2,事务: T2 */
SELECT count(1) FROM books WHERE price < 100					/* 时间顺序:3,事务: T1 */

不可重复读:它是指在事务执行过程中,对同一行数据的两次查询得到了不同的结果。

SELECT * FROM books WHERE id = 1;   						/* 时间顺序:1,事务: T1 */
UPDATE books SET price = 110 WHERE id = 1; COMMIT;			/* 时间顺序:2,事务: T2 */
SELECT * FROM books WHERE id = 1; COMMIT;   				/* 时间顺序:3,事务: T1 */

脏读:它是指在事务执行过程中,一个事务读取到了另一个事务未提交的数据。

SELECT * FROM books WHERE id = 1;   						/* 时间顺序:1,事务: T1 */
/* 注意没有COMMIT */
UPDATE books SET price = 90 WHERE id = 1;					/* 时间顺序:2,事务: T2 */
/* 这条SELECT模拟购书的操作的逻辑 */
SELECT * FROM books WHERE id = 1;			  				/* 时间顺序:3,事务: T1 */
ROLLBACK;			  										/* 时间顺序:4,事务: T2 */

除了都以锁来实现外,以上四种隔离级别还有另一个共同特点,就是幻读、不可重复读、脏读等问题都是由于一个事务在读数据过程中,受另外一个写数据的事务影响而破坏了隔离性,针对这种“一个事务读+另一个事务写”的隔离问题出现了多版本并发控制的无锁优化方案。
mvcc (multi-version concurrency controller):MVCC 的基本思路是对数据库的任何修改都不会直接覆盖之前的数据,而是产生一个新版副本与老版本共存,以此达到读取时可以完全不加锁的目的.
可以理解为数据库中每一行记录存在两个看不见的字段CREATE_VERSION 和 DELETE_VERSION,这两字字段记录的值是事务ID,事务id是递增的。

mvcc主要针对的是可重复读和读已提交的隔离级别出现的读和写出现的问题,一个事务读一个事务写

乐观锁:事务写+写场景
悲观锁:以上锁均属于悲观锁

乐观锁:在操作数据的时候非常乐观,乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。在乐观锁中,数据被读的时候不会加锁,但在更新数据的时候会判断在此期间有没有其他用户修改过这个数据,若有其他用户修改过这个数据,则该用户提交更新操作会被阻塞,转而执行其他操作。
悲观锁:在操作数据的时候比较悲观,悲观地认为别人一定会同时修改数据,因此悲观锁在操作数据时是直接把数据上锁,直到操作完成之后才会释放锁。在悲观锁中,数据被读的时候会被锁定,其他用户无法进行读取或者写入,只能等待锁被释放。

全局事务

全局事务:单服务多数据源
XA 是 (extended Architecture 的缩写)的处理事务架构,其核心内容是定义了全局的事务管理器(Transaction Manager,用于协调全局事务)和局部的资源管理器(Resource Manager,用于驱动本地事务)之间的通信接口。XA 接口是双向的,能在一个事务管理器和多个资源管理器(Resource Manager)之间形成通信桥梁,通过协调多个数据源的一致动作,实现全局事务的统一提交或者统一回滚,是一套语言无关的通用规范。
二段式提交协议:
准备阶段:(又叫投票阶段)协调者询问事务的所有参与者是否准备好提交,参与者如果已经准备好提交则回复 Prepared,否则回复 Non-Prepared
提交阶段:(又叫执行阶段)
在这里插入图片描述
缺点:
1.单点问题:如果协调者宕机,一直没有恢复,没有正常发送 Commit 或者 Rollback 的指令,那所有参与者都必须一直等待
2.性能问题:
3.一致性风险:数据不一致

三段式提交协议:
CanCommit:(询问阶段),协调者让每个参与的数据库根据自身状态,评估该事务是否有可能顺利完成
PreCommit:准备阶段
DoCommit:提交阶段
在这里插入图片描述
三段式提交对单点问题和回滚时的性能问题有所改善,但是它对一致性风险问题并未有任何改进,在这方面它面临的风险甚至反而是略有增加了的。譬如,进入 PreCommit 阶段之后,协调者发出的指令不是 Ack 而是 Abort,而此时因网络问题,有部分参与者直至超时都未能收到协调者的 Abort 指令的话,这些参与者将会错误地提交事务,这就产生了不同参与者之间数据不一致的问题。

共享事务

共享事务:多个服务共用一个数据源
在这里插入图片描述
一种理论可行的方案是直接让各个服务共享数据库连接

分布式事务

分布式事务(Distributed Transaction)特指多个服务同时访问多个数据源的事务处理机制
“在分布式服务环境下的事务处理机制”
CAP 定理(Consistency、Availability、Partition Tolerance Theorem),也称为 Brewer 定理;起源于在 2000 年 7 月,是加州大学伯克利分校的 Eric Brewer 教授于“ACM 分布式计算原理研讨会(PODC)”上提出的一个猜想。
一致性(Consistency):代表数据在任何时刻、任何分布式节点中所看到的都是符合预期的。
可用性(Availability):代表系统不间断地提供服务的能力,可用性衡量系统可以正常使用的时间与总时间之比,其表征为:A=MTBF/(MTBF+MTTR),即可用性是由可靠性和可维护性计算得出的比例值,譬如 99.9999%可用,即代表平均年故障修复时间为 32 秒。
分区容忍性:代表分布式环境中部分节点因网络原因而彼此失联后,即与其他节点形成“网络分区”时,系统仍能正确地提供服务的能力。
择放弃一致性的 AP 系统目前是设计分布式系统的主流选择,AP,CP
分布式系统设计最终一致性,很难达到强一致性。
最终一致性 (opens new window)(Eventual Consistency),它是指:如果数据在一段时间之内没有被另外的操作所更改,那它最终将会达到与强一致性过程相同的结果,有时候面向最终一致性的算法也被称为“乐观复制算法”。

可靠消息队列

可靠事件队列还有一种更普通的形式,被称为“最大努力一次提交”(Best-Effort 1PC),指的就是将最有可能出错的业务以本地事务的方式完成后,采用不断重试的方式(不限于消息系统)来促使同一个分布式事务中的其他关联业务全部完成。

在这里插入图片描述

TCC事务

TCC 是另一种常见的分布式事务机制,它是“Try-Confirm-Cancel”三个单词的缩写
Try:尝试执行阶段,完成所有业务可执行性的检查(保障一致性),并且预留好全部需用到的业务资源(保障隔离性)。
Confirm:确认执行阶段,不进行任何业务检查,直接使用 Try 阶段准备的资源来完成业务处理。Confirm 阶段可能会重复执行,因此本阶段所执行的操作需要具备幂等性。
Cancel:取消执行阶段,释放 Try 阶段预留的业务资源。Cancel 阶段可能会重复执行,也需要满足幂等性
在这里插入图片描述

SAGA事务

SAGA 由两部分操作组成。

大事务拆分若干个小事务,将整个分布式事务 T 分解为 n 个子事务,命名为 T1,T2,…,Ti,…,Tn。每个子事务都应该是或者能被视为是原子行为。如果分布式事务能够正常提交,其对数据的影响(最终一致性)应与连续按顺序成功提交 Ti等价。
为每一个子事务设计对应的补偿动作,命名为 C1,C2,…,Ci,…,Cn。Ti与 Ci必须满足以下条件:
Ti与 Ci都具备幂等性。
Ti与 Ci满足交换律(Commutative),即先执行 Ti还是先执行 Ci,其效果都是一样的。
Ci必须能成功提交,即不考虑 Ci本身提交失败被回滚的情形,如出现就必须持续重试直至成功,或者要人工介入。
如果 T1到 Tn均成功提交,那事务顺利完成,否则,要采取以下两种恢复策略之一:

正向恢复(Forward Recovery):如果 Ti事务提交失败,则一直对 Ti进行重试,直至成功为止(最大努力交付)。这种恢复方式不需要补偿,适用于事务最终都要成功的场景,譬如在别人的银行账号中扣了款,就一定要给别人发货。正向恢复的执行模式为:T1,T2,…,Ti(失败),Ti(重试)…,Ti+1,…,Tn。
反向恢复(Backward Recovery):如果 Ti事务提交失败,则一直执行 Ci对 Ti进行补偿,直至成功为止(最大努力交付)。这里要求 Ci必须(在持续重试后)执行成功。反向恢复的执行模式为:T1,T2,…,Ti(失败),Ci(补偿),…,C2,C1。

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

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

相关文章

石器时代H5小游戏架设教程

本文讲解石器时代 H5 之恐龙宝贝架设教程&#xff0c;想研究 H5 游戏如何实现&#xff0c;那请跟着此次教程学习在拥有小游戏源码的情况下该如何搭建起来 开始架设 1. 架设条件 石器时代架设需要准备&#xff1a; 一台linux 服务器&#xff0c;建议 CentOs 7.6 版本&#xf…

2023 英特尔On技术创新大会直播 |AI科技创新的引路者

英特尔大会 前言英特尔人工智能英特尔创新技术基于英特尔架构的科学计算总结 前言 英特尔技术创新大会是一个令人激动和启发的盛会。在这次大会上&#xff0c;我有幸观看了许多令人瞩目的科技创新和前沿技术的展示。这些展示不仅展示了英特尔作为科技巨头的实力&#xff0c;更…

告诉你playwright 不使用with sync_playwright() as编写脚本的新方法

大家都知道playwright代码的标准写法是&#xff1a; with sync_playwright() as p:browser p.chromium.launch(channel"chrome", headlessFalse)page browser.new_page()page.goto("http://www.baidu.com")print(page.title())browser.close() with sy…

Vue - 组件注册及其原理

1 Vue组件注册 Vue中注册组件的方式有两种&#xff1a;全局注册和局部注册。 2 局部注册 import HelloWorld from xxx/xxx export default {components: {HelloWorld} }3 全局注册 3.1 全局组件挂载 示例一&#xff1a; /** src/main.js */ // 表格动态列组件 import Dyn…

mysql 22day 对表格的增删改查、对数据的增删改查、对内容进行操作

目录 mysql 配置文件授权 远程链接 &#xff08;grant&#xff09;数据库操作创建库&#xff08;create&#xff09;切换数据库&#xff08;use&#xff09;查看当前所在库 表操作创建一张员工表查看表结构修改表名称增加字段修改字段名&#xff08;ALTER &#xff09;修改字段…

Floyd求最短路(Floyd算法)

参考&#xff1a;约会怎么走到目的地最近呢&#xff1f;一文讲清所有最短路算法问题-CSDN博客 有4个城市8条路&#xff0c;公路上的数字表示这条公路的长短&#xff0c;并且路是单向的&#xff0c;现在要求我们求出任意两个城市之间的最短路程&#xff0c;也就是求任意两个点之…

MIT18.06线性代数 笔记1

文章目录 方程组的几何解释矩阵消元乘法和逆矩阵A的LU分解转置-置换-向量空间R列空间和零空间求解Ax0主变量 特解求解Axb可解性和解的结构线性相关性、基、维数四个基本子空间矩阵空间、秩1矩阵和小世界图图和网络复习一 方程组的几何解释 线性组合&#xff1a; 找到合适的x和…

GitHub 如何修改 Fork from

如果你的仓库上面是 Fork from 的话&#xff0c;我们有什么办法能够取消掉这个 Fork from&#xff1f; 解决办法 GitHub 上面没有让你取消掉 Fork 的办法。 如果进入设置&#xff0c;在可见设置中也没有办法修改仓库的可见设置选项。 唯一的解决办法就是对你需要修改的仓库先…

透视数据:数据可视化工具的多重场景应用

数据可视化工具已经成为了许多领域中的重要利器&#xff0c;它们在各种场景下发挥着重要作用。下面我就以可视化从业者的角度简单谈谈数据可视化工具在不同场景下的应用&#xff1a; 企业数据分析与决策支持 在企业层面&#xff0c;数据可视化工具被广泛应用于数据分析和决策…

蓝牙键盘怎么连接电脑?正确操作步骤分享!

“由于我经常需要用到电脑&#xff0c;为了方便&#xff0c;我新买了一个蓝牙键盘&#xff0c;但是我不知道应该如何把这个蓝牙键盘连接上电脑&#xff0c;有没有朋友可以分享方法呀&#xff1f;” 在数字化时代&#xff0c;蓝牙设备已经成为了我们生活中不可或缺的一部分。其中…

spark介绍及简单使用

简介 Spark是由加州大学伯克利分校AMPLab&#xff08;AMP实验室&#xff09;开发的开源大数据处理框架。起初&#xff0c;Hadoop MapReduce是大数据处理的主流框架&#xff0c;但其存在一些限制&#xff0c;如不适合迭代算法、高延迟等。为了解决这些问题&#xff0c;Spark在20…

Hutool--DFA 敏感词工具类

使用hutool的dfa工具类可以很好的帮助我们来实现敏感词过滤的功能&#xff0c;下面从用例入手来逐步地去j简单了解一下dfa工具类。 字典树 DFA算法的核心是建立了以敏感词为基础的许多敏感词树&#xff08;字典树&#xff09;。 它的基本思想是基于状态转移来检索敏感词。 字…

AI 绘画 | Stable Diffusion 去除照片马赛克

前言 本篇文章教会你如何让几秒钟去除图片中的马赛克,还是依托于Stable Diffusion WEB UI的强大扩展插件ControlNet,快来学起来吧,如果有问题请在评论区留言。 教程 选择大模型 首先在图生图,选择一个写实风格的大模型(我这里选择是majicMIX realistic 麦橘写实_v7.saf…

Apache RocketMQ 5.0 腾讯云落地实践

Apache RocketMQ 发展历程回顾 RocketMQ 最早诞生于淘宝的在线电商交易场景&#xff0c;经过了历年双十一大促流量洪峰的打磨&#xff0c;2016年捐献给 Apache 社区&#xff0c;成为 Apache 社区的顶级项目&#xff0c;并在国内外电商&#xff0c;金融&#xff0c;互联网等各行…

内网渗透测试基础——内网信息收集

内网渗透测试基础——内网信息收集 在内网渗透测试环境中&#xff0c;有很多设备和防护软件&#xff0c;例如Bit9、ArcSight、Maniant等。它们通过收集目标内网的信息&#xff0c;洞察内网网络拓扑结构&#xff0c;找出内网中最薄弱的环节。信息收集的深度&#xff0c;直接关系…

Java 数据结构篇-实现堆的核心方法与堆的应用(实现 TOP-K 问题:最小 k 个数)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 堆的说明 2.0 堆的成员变量及其构造方法 3.0 实现堆的核心方法 3.1 实现堆的核心方法 - 获取堆顶元素 peek() 3.2 实现堆的核心方法 - 下潜 down(int i) 3.3 实…

C/C++ 使用 MySQL API 进行数据库操作

C/C 使用 MySQL API 进行数据库操作 一、前言 随着信息时代的到来&#xff0c;数据库的应用日益广泛&#xff0c;MySQL 作为开源的关系型数据库管理系统&#xff0c;被广大开发者所喜爱。在 C/C 程序中&#xff0c;我们可以通过 MySQL 提供的 API 接口来连接数据库&#xff0…

研发管理-代码管理篇

前言&#xff1a; 工作了这些年&#xff0c;工作了三家公司&#xff0c;也用过主流的代码管理平台&#xff0c;比如SVN&#xff0c;git系列&#xff08;gitlib,gitee&#xff09;,各有优点&#xff0c;我个人比较喜欢SVN&#xff0c;多人协作的代码管理难免会有代码冲突&#…

【算法】红黑树

一、红黑树介绍 红黑树是一种自平衡二叉查找树&#xff0c;是在计算机科学中用到的一种数据结构&#xff0c;典型的用途是实现关联数组。 红黑树是在1972年由Rudolf Bayer发明的&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;。后来&am…

【C语言】SCU安全项目2-BufBomb

目录 关键代码解读&#xff1a; getxs() getbuf() test() 核心思路 具体操作1 具体操作2 前段时间忙于强网杯、英语4级和一些其他支线&#xff0c;有点摸不清头绪了&#xff0c;特别是qwb只有一个输出&#xff0c;太过坐牢&#xff0c;决定这个安全项目做完后就继续投身…