【事务】本地事务和分布式事务的区别

news2025/1/26 15:50:16

整理下事务相关的知识点:

文章目录

  • 一、事务
    • MySQL事务
    • 事务的实现
    • 事务的ACID特性
    • 事务的隔离级别
  • 二、本地事务
  • 三、分布式事务
    • 认识分布式事务
    • CAP理论
    • BASE理论

一、事务

先复习下数据库中学到的事务:

MySQL事务

一个事务即一个完整的业务逻辑,如A账户向B账户转10000,则A-10000,B+10000,以上操作是一个最小的工作单元,要么同时成功,要么同时失败。两个update同成功或同失败,才能保证业务的正确性。

  • 只有DML语句(insert、delete、update)才有事务一说,其余SQL与事务无关
  • 整个业务只需一条SQL完成时,事务机制也就没必要了
  • 事务,本质就是多条DML语句同成功或同失败,这多条DML对应一个业务

事务的实现

在这里插入图片描述
提交事务commit:

  • 清空对应事务性活动的日志文件,将数据全部持久化到数据库表中
  • 事务提交标志着事务的结束,且是一种全部成功的结束

回滚事务rollback:

  • 将之前所有的DML操作全部撤销,然后清空事务性活动的日志文件
  • 回滚事务标志着事务的结束,且是一种全部失败的结束

MySQL默认自动提交事务,即每执行一条DML,就提交一次,此时无法回滚start transaction;即开启事务(也就是关闭自动提交)

在这里插入图片描述

事务的ACID特性

  • A:原子性,说明事务是最小的工作单元,不可再分
  • C:一致性,在统一事务中,所有操作要么同成功、要么同失败
  • I:隔离性,A事务和B事务之间具有一定的隔离(具体往下看),A事务在操作一张表的时候,B事务也可以操作这张表
  • D:持久性,事务提交,就相当于将没有保存到硬盘上的数据存到了磁盘

事务的隔离级别

当事务A和事务B同时操作表table:
在这里插入图片描述

  • 读未提交:
    事务A可以读到事务B未提交的数据,隔离级别最低,存在脏读现象(Dirty Read),即读到了脏数据

  • 读已提交:
    事务A只能读到事务B提交后的数据,这解决了脏读问题,但有新问题就是不可重复读取数据。如事务开启后,第一次读到3条数据,一会儿后,当前事务还未结束,并且又读了一遍,可能读到4条,两次不一致即不可重复读取。这是Oracle默认的级别。

  • 可重复读
    事务A开启后,不管过多久,每一次在事务A中读到的数据中都是一致的,即使在操作同一张表的事务B将表中的数据修改并且提交,A读到的数据还是刚开始的数据。这个级别解决了不可重复读取的问题,但出现幻影读,即每次读到的数据都是幻想,不一定真实,永远读取的都是刚开启事务时的数据(对开启事务时的数据做了备份或快照,然后读备份),这是Mysql的默认级别。

  • 序列化/串行:
    最高级别,事务排队,不能并发,每一次读到的数据都是最真实的,但效率最低。图示:
    在这里插入图片描述

- 查看隔离级别
select @@transaction_isolation;
select @@tx_isolation;
show variables like 'transaction_isolation';
- 设置隔离级别为读未提交
set global transaction isolation level read uncommitted;

二、本地事务

整个服务操作只能涉及一个单一的数据库资源,这类基于单个服务单一数据库资源访问的事务,被称为本地事务
在这里插入图片描述

三、分布式事务

认识分布式事务

本地事务的情况下,所有数据都会落到同一个DB中,但是,在分布式的情况下,就会出现数据可能要落到多个DB,或者还会落到Redis,落到MQ等中。

在这里插入图片描述
分布式事务,即一个事务的完成需要多个服务的协调与网络通信,此时要保证不同数据库的数据一致性(同失败或同失败)
在这里插入图片描述

细分举例:

  • 单服务多数据库
    在这里插入图片描述

  • 一个服务操作需要调用另外一个服务
    在这里插入图片描述
    在这里插入图片描述

CAP理论

相比于数据库事务或本地事务中的ACID,分布式事务有CAP理论:

  • C:Consistency,一致性
  • A:Availability,可用性
  • P:Partition tolerance,分区容忍性

使用下图中的简单分布式系统结构来阐述C、A、P:客户端经过网关访问用户服务的两个结点(对应有两个库)
在这里插入图片描述

  • 一致性:用户不管访问哪一个结点拿到的数据都是最新的
  • 可用性:指任何时候查询用户信息都可以查询到结果,但不保证查询到最新的数据
  • 分区容忍性:也叫分区容错性,当系统采用分布式架构时由于网络通信异常导致请求中断、消息丢失,系统依然能对外提供服务

CAP理论即在分布式系统中C、A、P三点不可能全部满足

比如:添加用户小明的信息,信息先添加到节点1,再同步到节点2:

在这里插入图片描述

  • 为满足C一致性,就要等小明的信息同步到节点2,此时可用性没了
  • 要可用性A,此时不用等小明的信息同步到节点2,但一致性就没了

所以在分布式系统中进行分布式事务控制,要么保证CP、要么保证AP。要根据你的实际需求来确定选CP还是AP,然后再根据选择来进行技术选型

CP场景:(追求数据一致性,舍弃A)

跨行转账:一次转账请求要等待双方银行系统都完成整个事务才算完成,只要其中一个失败另一方执行回滚操作。此时应该追求一致性。

AP场景:(强调可用性,舍弃C)

订单退款:今日退款成功(先告诉你成功了),明日账户到账(数据后续完成一致性),只要用户可以接受在一定时间内到账即可

AC:放弃分区容错性的话,则放弃了分布式,失去初衷了就,不做考虑

BASE理论

上面的AP,虽说舍弃C,但并不是不要求数据一致性,数据最终也会一致,只是不要求立即一致,实际上最终数据还是达到了一致。因此出现BASE理论:

  • Basically Available(基本可用):当系统无法满足全部可用时保证核心服务可用即可
  • Soft state(软状态):是指可以存在中间状态,比如:打印自己的社保统计情况,该操作不会立即出现结果,而是提示你打印中,请在XXX时间后查收
  • Eventually consistent (最终一致性):退款操作后没有及时到账,经过一定的时间后账户到账,舍弃强一致性,满足最终一致性

在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证最终一致性。

关于AP的实现思路,可以采用 本地消息表+任务调度机制完成分布式事务最终数据一致性的控制


参考文档:https://zhuanlan.zhihu.com/p/610552000

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

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

相关文章

计算机组成原理——第三章存储系统(下)

提示:年年岁岁花相似,岁岁年年人不同 文章目录3.4.1 磁盘存储器3.4.2 固态硬盘SSD3.5.1 Cache的基本概念和原理3.5.2 Cache和主存的映射方式3.5.3 Cache替换算法3.5.4 Cache写策略3.6.1 页式存储3.6.2 虚拟存储器3.4.1 磁盘存储器 我们在磁性盘面上涂磁…

【hello Linux】Linux下 gitee 的使用

目录 1. 安装 git 2. gitee 的使用 2.1 注册 gitee 账号 2.2 创建项目:也就是仓库 2.3 下载项目到本地 3. 上传gitee三步走 3.1 三板斧第一招:git add 3.2 三板斧第二招:git commit 3.3 三板斧第三招:git push Linux&#x1f337…

【JavaEE】Spring项目的创建与使用

目录 创建Spring项目 创建Maven项目 引入依赖 使用镜像下载 下载依赖 添加启动类 使用Spring项目 创建Spring配置文件 存储Bean 取出并使用Bean(通过ApplicationContext接口) 通过id 通过class 通过classid(推荐) 取出并使用Bean(通过BeanFactory接口) Applicat…

从零入门激光SLAM(六)——ROS常用工具箱

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激…

【react 全家桶】组合组件

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录09 【组合组件】1.包含关系2.特例关系问题…

P3369 【模板】普通平衡树(FHQ Treap树构建和解析)

题目描述 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 插入 x 数删除 x 数(若有多个相同的数&#xff0c;应只删除一个)查询 x 数的排名(排名定义为比当前数小的数的个数 1 )查询排名…

【Kafka-Kerberos下执行shell命令】Kafka在Kerberos环境下如何操作shell命令

【Kafka-Kerberos下执行shell命令】Kafka在Kerberos环境下如何操作shell命令1&#xff09;jaas.conf2&#xff09;client.properties3&#xff09;执行命令当大数据集群部署了 Kerberos 认证操作之后&#xff0c;在服务器上操作 kafka shell 命令就会出现认证相关的异常&#x…

【hello Linux】Linux开发工具

目录 1. vim&#xff1a;文本编辑器 1.1 各种模式的切换 补充&#xff1a;ctrl r命令 1.2 命令模式的操作 1.3 插入模式的操作 1.4 底行模式的操作 1.5 配置vim环境 1.6 配置亲属关系 2. gcc/g&#xff1a;编译器 2.1 预处理&#xff1a; 2.2 编译&#xff1a; 2.3 汇编&#x…

Gsum: A General Framework for Guided Neural Abstractive Summarization 论文笔记

Gsum: A General Framework for Guided Neural Abstractive Summarization 论文笔记 Year: 2021 Venue: NAACL Institution: CMU Code: https://github.com/neulab/guided_summarization Overview 这篇文章力求解决的问题是如何控制文本摘要生成&#xff0c;尤其注重可信度方…

floyed 4.9

今天是周末,也就不为难自己了,学习了一下floyed算法(确实简单哈哈),这个算法也是最短路的一种 在一副图中,a到b的距离可能不是直接的ab边最短,这时候就要用到floyed的思想了,可能是a到c到b比直接a到b最短.所以我们要枚举一边才可以知道a到b的最短的路线 这就是floyed的大概 …

7年测试,从功能测试到测试开发,我总算证明了自己

我感觉我是一个比较有发言权的人吧&#xff0c;我在测试行业爬模滚打7年&#xff0c;从点点点的功能测试到现在成为测试开发工程师&#xff0c;工资也翻了几倍&#xff1b; 个人觉得&#xff0c;测试的前景并不差&#xff0c;只要自己肯努力&#xff1b;我刚出来的时候是在鹅厂…

FL Studio21中文版D编曲数字音乐工作软件

随着现在人们的生活水平不断提高&#xff0c;我们的精神生活也越来越丰富&#xff0c;对于现在的年轻人来说&#xff0c;DJ舞曲是一个较受欢迎的领域&#xff0c;有许多年轻人对DJ这个职业感兴趣&#xff0c;想要深入了解DJ编曲这份工作&#xff0c;那么今天我们就来说一说DJ编…

聊聊ChatGPT无法取代的7个工作

ChatGPT——全世界都在谈论的非常流行的人工智能工具。自从 2022 年 11 月 30 日推出以来&#xff0c;ChatGPT 就被证明是执行复杂任务并简化它们的一体式工具。无论是通过 UPenn 的沃顿商学院 MBA 考试&#xff0c;撰写常春藤盟校入学论文&#xff0c;还是完成简单的任务&…

Django自带的Admin后台中如何获取当前登录用户

需求背景 在使用Django快速开发一个IT 电脑、显示器资产管理小系统的时候&#xff0c;遇到一个问题是&#xff0c;当变更资产设备&#xff08;新增、修改、删除&#xff09;的时候&#xff0c;能记录是谁在什么时间进行的变更。 确认的是肯定是登录状态&#xff0c;但是在使用…

算法学习|动态规划 LeetCode 647. 回文子串、516.最长回文子序列

动态规划一、回文子串思路实现代码二、最长回文子序列思路实现代码&#xff08;希望自己能总结出做过的动态规划题&#xff01;要开始回顾之前刷过的题了&#xff09; 一、回文子串 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或…

回收站数据恢复的方法技巧

​最近有网友反映将一些不经常使用的文件放入回收站后忘记了&#xff0c;清空回收站后想要再次使用文件却怎么都还原不了&#xff0c;想利用回收站数据恢复软件经恢复&#xff0c;咨询有哪些回收站数据恢复软件推荐&#xff0c;下面就给大家推荐回收站数据恢复软件使用方法。 …

数据库开发重点存档

2023春数据库开发复习 T1 视图可以用的几个场景&#xff1f; 不同表字段聚合、信息重组&#xff1a;当某个查询涉及多表连接、次数频繁时&#xff0c;可以创建视图隐藏底层表的复杂性&#xff0c;简化查询。 控制权限&#xff1a;根据不同用户的权限&#xff0c;可以建立不同…

星巴克创始人第三次重出江湖

星巴克创始人第三次出山&#xff0c;与中国有关 中国咖啡连锁竞争白热化 星巴克诞生于1985年&#xff0c;爷爷级的公司 趣讲大白话&#xff1a;百年老店不容易 【趣讲信息科技135期】 **************************** 将心注入 星巴克创始人自传 创始人的激情、执行力、团队建设很…

HttpRunner3.x 源码解析(5)-runner.py

首先看下生成的pytest文件 from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseLogin(HttpRunner):config (Config("登录成功").variables(**{"password": "tester", "expect_foo2": "co…

17_I.MX6ULL_内部RTC

目录 I.MX6U RTC简介 相关寄存器 实验源码 I.MX6U RTC简介 实时时钟是很常用的一个外设,通过实时时钟我们就可以知道年、月、日和时间等信息。因此在需要记录时间的场合就需要实时时钟,可以使用专用的实时时钟芯片来完成此功能,但是现在大多数的MCU或者MPU内部就已经自带了…