【MySQL实战45讲3】事务隔离

news2024/9/29 19:08:06

文章目录

    • 事务
      • 事务四大特性(ACID)
    • 隔离级别
      • 可重复读的使用场景
      • 可重复读隔离级别的实现

事务

事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。MySQL是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一。

事务四大特性(ACID)

  • 原子性(Atomicity):事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。
  • 一致性(Consistency):数据在事务执行前后保持一致。
  • 隔离性(Isolation):一个事务所做的修改在最终提交以前,对其他事务是不可见的。
  • 持久性(Durability):一旦事务提交,则其所做的修改将会永远保存在数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

隔离级别

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)不可重复读(nonrepeatable read)、**幻读(phantom read)**的问题,为了解决这些问题,就有了隔离级别的概念。

隔离得越严实,效率就会越低。

SQL标准的事务隔离级别包括:

  • 读未提交(read uncommited):一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交(read commited):一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务启动时看到的数据是一致的。在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化(serializable):对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

通过下面的案例来理解四种隔离级别:

事务A事务B
启动事务查询得到值1启动事务
查询得到值1
将1改成2
查询得到值V1
提交事务B
查询得到值V2
提交事务A
查询得到值V3
  • 隔离级别是“读未提交”:则V1的值为2。这时候事务 B 虽然还没有提交,但是结果已经被 A 看到了。因此,V2、V3 也都是 2。
  • 隔离级别是“读提交”:则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A 看到。所以, V3 的值也是 2。
  • 隔离级别是“可重复读”:则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是这个要求:事务在执行期间看到的数据前后必须是一致的。
  • 隔离级别是“串行化”:则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务 A 提交后,事务 B 才可以继续执行。所以从 A 的角度看, V1、V2 值是 1,V3 的值是 2。

可重复读的使用场景

假设你在管理一个个人银行账户表。一个表存了账户余额,一个表存了账单明细。到了月底你要做数据校对,也就是判断上个月的余额和当前余额的差额,是否与本月的账单明细一致。你一定希望在校对过程中,即使有用户发生了一笔新的交易,也不影响你的校对结果。

可重复读隔离级别的实现

在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

假设一个值从A被顺序改变成了B、C、D,在回滚日志里面会有类似下面的记录。

MVCC

当前值是 D,但是在查询这条记录的时候,不同时刻启动的事务会有不同的 readview。如图中看到的,在视图 1、2、3 里面,这一个记录的值分别是 A、B、D,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。对于 readview 1,要得到 A,就必须将当前值依次执行图中所有的回滚操作得到。同时你会发现,即使现在有另外一个事务正在将 D 改成 E,这个事务跟 readview 1、2、3 对应的事务是不会冲突的。

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

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

相关文章

EasyCVR智慧公园视频智能管理方案:赋能公园安全管理新高度

随着城市化进程的加速,智慧城市建设已成为提升城市管理效率、增强居民生活质量的重要途径。智慧公园作为智慧城市的重要组成部分,其安全与管理水平直接影响着市民的休闲娱乐体验。EasyCVR智慧公园视频智能管理方案,正是基于这一背景应运而生&…

android锁屏界面userActivity自动息屏深入剖析

背景: 近来有有个学员朋友在锁屏画面自动息屏有一些疑问求助马哥这边,大致情况描述如下: 问题1、锁屏画面不停的点击触摸发现锁屏画面会一直常亮,这里他知道锁屏这个window比较特殊,正常其他window在InputDispatcher…

nvm 安装node 报错

Could not retrieve https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt. Get "https://npm.taobao.org/mirrors/node/latest/SHASUMS256.txt": tls: failed to verify certificate: x509: certificate is valid for *.tbcdn.cn 原因认证过期, 查看nvm安装…

城市大脑:智慧城市的神经中枢——典型实践与经验启示

随着信息技术的飞速发展,智慧城市已成为全球城市转型升级的重要方向。“城市大脑”作为智慧城市的核心引擎,正以其强大的数据处理能力、智能决策支持和跨领域协同优势,引领着城市管理与服务的深刻变革。本文将深入探讨几个具有代表性的“城市…

Sql Developer日期显示格式设置

默认时间格式显示 设置时间格式:工具->首选项->数据库->NLS->日期格式: DD-MON-RR 修改为: YYYY-MM-DD HH24:MI:SS 设置完格式显示:

【2024最新】华为HCIE认证考试流程

HCIE是华为认证体系中最高级别的ICT技术认证,表示通过认证的人具有ICT领域专业知识和丰富实践经验。 HCIE认证方向:最高认证级别HCIE的技术方向有13个 下面以HCIE-Datacom为例给大家介绍一下: HCIE-Datacom认证考试流程: 1.笔试…

PCL 读取并显示obj网格模型

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 本文将介绍如何使用PCL库读…

高级算法设计与分析 学习笔记10 平摊分析

动态表,可以变长。 一溢出就另起一个两倍大小的表。 可以轻易证明把n个数字放进去的时间复杂度是O(n),n n/2 n/4……也就2n,插入数字本身也就是n,加起来最多不超过3n. 这种复杂度究竟是怎么算的?毕竟每次插入复杂度…

visual studio2022添加新项中没有html和css

目录 背景解决过程vs版本正常新建项的方式添加工作负荷添加Node.js开发找到工作负荷的方式 知识扩展与总结工作负荷Web开发在Visual Studio中的特殊性添加或修改工作负荷的步骤 背景 重装的vs2022,开发c#项目,但是打开发现添加新项中没有html,也没有css…

7.3树形查找

7.3.1二叉排序树 1.定义 目的:提供查找删除,插入关键字的速度 二叉排序树的特性: 左子树<根节点<右子树左右字数也分别是一棵二叉树 对二叉排序树进行中序遍历,可以得到一个递增的有序序列 2.二叉排序树的查找 查找从根节点开始,沿分支逐层向下比较的过程 二叉排序…

中国的“地理中心”在哪里?

我国是一个海陆兼备的国家&#xff0c;无论是960万平方公里的辽阔&#xff0c;还是300万平方公里的澎湃。 从南到北&#xff0c;自西向东&#xff0c;跨越了五个时区&#xff0c;涵盖了多种地形和气候。 那么&#xff0c;中国的“地理中心”到底在哪里呢&#xff1f; 大地原…

Azure OpenAI检索增强微调:使用 GPT-4o 对 GPT-4o mini 进行微调,以适应特定领域的应用

定制是关键&#xff01; 生成式人工智能对企业最有影响力的应用之一是创建自然语言界面&#xff0c;这些界面经过定制&#xff0c;可以使用特定领域和用例数据来提供更好、更准确的响应。这意味着回答有关特定领域的问题&#xff0c;例如银行、法律和医疗领域。 我们经常谈…

【Linux第五课-进程上】PCB内部属性、标识符、进程状态、Linux下的进程状态、进程的优先级、Linux进程的调度与切换

目录 体系结构 -- 硬件上操作系统 -- 软件上进程PCB内部属性1、在linux里面看程序2、标识符获取程序的标识符父进程标识符 PPID查看进程的另一种方法通过系统调用创建进程 - fork杀掉一个进程for循环创建多个代码 3、进程状态进程排队 - 队列教程上关于进程状态表述运行阻塞&am…

ubuntu2204操作系统使用可执行文件方式安装docker-compose记录

文章目录 前言一、版本信息二、操作步骤2.1 确认版本2.2 下载部署2.官网参考3.docker-compose版本 总结 前言 记录一下在ubuntu操作系统上使用下载可执行文件方式部署docker-compose的记录。 一、版本信息 操作系统版本&#xff1a; docker-compose版本&#xff1a; 备注&…

RISC-V开发 linux下GCC编译自定义指令流程笔记

第一步&#xff1a;利用GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言 第二步&#xff1a;利用RSIC-V的中的.insn模板进行自定义指令的插入 第三步&#xff1a;RISC-V开发环境的搭建 C语言插入汇编 GCC提供了内嵌汇编的功能可以在C代码中直接内嵌汇编语言语句方便了…

Vue3.0面试题汇总

Composition API 可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api&#xff0c;解决了什么问题&#xff1f; 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺…

【Linux基础IO】Linux IO编程入门:揭秘动态库与静态库的秘密

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Linux Shell &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux基础IO &#x1f4d2;1. …

Mysql梳理10——使用SQL99实现7中JOIN操作

10 使用SQL99实现7中JOIN操作 10.1 使用SQL99实现7中JOIN操作 本案例的数据库文件分享&#xff1a; 通过百度网盘分享的文件&#xff1a;atguigudb.sql 链接&#xff1a;https://pan.baidu.com/s/1iEAJIl0ne3Y07kHd8diMag?pwd2233 提取码&#xff1a;2233 # 正中图 SEL…

Git 的安装和配置

Git 是跨平台的&#xff0c;可以在 Windows&#xff0c;Linux、Unix 和 Mac 各几大平台上使用 由于笔者主要是使用 Windows&#xff0c;其他平台下安装 Git 的方法暂且不表&#xff08;可参考廖雪峰老师的博客&#xff1a;安装 Git&#xff09; ‍ Windows 安装 Git 从 Git…

【案例73】Uclient无法读取https地址添加应用

问题现象 客户做了一个https的域名转换&#xff0c;网页端是正常访问的&#xff0c;但是在uclient里面添加应用就不行了,出来两个不对的应用&#xff0c;也安装不了&#xff0c;提示失败。 问题分析 点击添加应用发现&#xff0c;本来添加地址是https://域名:外网端口&#x…