2023年MySQL实战核心技术第三篇

news2024/11/23 19:46:20

目录

六 . 事务隔离:为什么改了还看不见?

6.1 解释:

6.2 隔离性与隔离级别

6.2.1 SQL 标准的事务隔离级别:

6.2.2 事务隔离级别解释:

6.2.3 例子:

6.2.3.1 若隔离级别是“读未提交”

6.2.3.2 若隔离级别是“读提交”

6.2.3.3 若隔离级别是“可重复读”

6.2.3.4 若隔离级别是“串行化”

6.2.3.5读提交和可重复读的视图创建详解:

6.2.3.6 Oracle迁移数据库MySQL


六 . 事务隔离:为什么改了还看不见?

6.1 解释:

提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是
转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。
转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作
必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着
这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要
用到“事务”这个概念了。

 事务就是要保证一组数据库操作,要么全部成功,要么全部失败。

在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是MyISAM 被InnoDB 取代的重要原因之一。

下面将以InnoDB为例子,进行MySQl在事务方面的特定实现,并基于原理给出解释。

6.2 隔离性与隔离级别

提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子
性、一致性、隔离性、持久性),今天我们就来说说其中 I,也就是“隔离性”。

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

在谈隔离级别之前,你首先要知道,你隔离得越严实,效率就会越低。因此很多时候,我们都
要在二者之间寻找一个平衡点。

6.2.1 SQL 标准的事务隔离级别:

读未提交(readuncommitted)、

读提交(read committed)、

可重复读(repeatable read)

串行化(serializable )。

6.2.2 事务隔离级别解释:


其中“读提交”和“可重复读”比较难理解,

例子说明这几种隔离级别:

假设数据表 T 中只有一列,其中一行的值为 1,下面是按照时间顺序执行两个事务的行为。

读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。

读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。

可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

6.2.3 例子:

假设表T只有一列,其中一行值为1.

mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);

在不同的隔离级别下,事务 A 会有哪些不同的返回结果,也就是图里面 V1、V2、
V3 的返回值分别是什么。


6.2.3.1 若隔离级别是“读未提交”

则 V1 的值就是 2。这时候事务 B 虽然还没有提交,但是结
果已经被 A 看到了。因此,V2、V3 也都是 2。


6.2.3.2 若隔离级别是“读提交”

则 V1 是 1,V2 的值是 2。事务 B 的更新在提交后才能被 A 看
到。所以, V3 的值也是 2。


6.2.3.3 若隔离级别是“可重复读”

则 V1、V2 是 1,V3 是 2。之所以 V2 还是 1,遵循的就是
这个要求:事务在执行期间看到的数据前后必须是一致的。


6.2.3.4 若隔离级别是“串行化”

则在事务 B 执行“将 1 改成 2”的时候,会被锁住。直到事务A 提交后,事务B才可以继续进行执行,所以从A的角度看,v1,v2值是1,v3的值是2.

在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”
隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提
交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是,
“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下
直接用加锁的方式来避免并行访问。

6.2.3.5读提交和可重复读的视图创建详解:

在数据库中,为了支持事务隔离性,系统会维护一个视图(或称为快照)来决定每个事务可以看到的数据内容。根据隔离级别的不同,在事务执行过程中创建视图的时间会有所区别。

在"可重复读"隔离级别下,事务启动时会创建一个一致性视图,这个视图包含了事务开始时刻数据库中的数据状态。整个事务期间,该一致性视图不会改变,因此事务内部所有的查询操作都是基于这一时刻的数据库状态进行的。其他并发事务对数据的修改不会被可重复读事务感知到,即使其他事务已经提交了对某个数据的修改,对于可重复读事务来说,该数据的值依然是一开始创建视图时的值。

而在"读提交"隔离级别下,每个SQL语句开始执行时都会创建一个新的视图,视图会基于当前的数据库状态生成。这意味着在执行每个SQL语句之前,都会反映其他并发事务已经提交的修改。因此,"读提交"隔离级别下的事务能够看到其他事务已经提交的修改。

总结区别:

  • 在"可重复读"隔离级别下,事务开始时创建一致性视图,整个事务期间使用该视图,不受其他事务的修改影响。
  • 在"读提交"隔离级别下,每个SQL语句开始执行时都会创建一个新的视图,能够看到其他已提交事务的修改。

6.2.3.6 Oracle迁移数据库MySQL

我们可以看到在不同的隔离级别下,数据库行为是有所不同的。Oracle 数据库的默认隔离级
别其实就是“读提交”,因此对于一些从 Oracle 迁移到 MySQL 的应用,为保证数据库隔离
级别的一致,你一定要记得将 MySQL 的隔离级别设置为“读提交”。
配置的方式是,将启动参数 transaction-isolation 的值设置成 READ-COMMITTED。你可以
用 show variables 来查看当前的值。

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

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

相关文章

无涯教程-JavaScript - BIN2DEC函数

描述 BIN2DEC函数将二进制数字转换为十进制。 语法 BIN2DEC (number)争论 Argument描述Required/Optionalnumber 您要转换的二进制数。 Number cannot contain more than 10 characters (10 bits). 数字的最高有效位是符号位。其余的9位是幅度位。 负数使用二进制补码表示。…

c++(c语言)通用版本的单链表的头插法创建

我们创建一个长度为n的链表时,可以采取头插法创建或者尾插法创建,本篇博客我们采取头插法来创建,(作者只学了头插,尾插等以后来补qwq)。 我们先来画图来看看头插的创建形式把,会了原理再写代码。 首先是我…

选择IT行业真的无路可走了吗?

虽说如今IT行业的市场上求职者众多,现在找工作难度也比之前大很多,但这个是大环境趋势,每个行业其实都存在这种情况,而且失业率也高达30%。现在企业一般招聘要求越来越高,各种行业都有劝退人士,劝退不要转行…

文献关系的可视化工具

文章目录 简介网站链接Demo说明数据库 简介 One minute to find a hundred related papers 网站链接 https://www.connectedpapers.com/ Demo 说明 You can use Connected Papers to: Get a visual overview of a new academic field Enter a typical paper and we’ll …

MySQL事务日志--redo, undo详解

事务有 4 种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢? 事务的隔离性由 锁机制 实现。 而事务的原子性、一致性和持久性由事务的 redo 日志和 undo 日志来保证。 REDO LOG 称为 重做日志 &#xff0c…

亚马逊下架电池,家用及商用电池UL2054检测报告介绍|亚马逊UL2054报告

UL2054是针对可充电电池和电池包的测试和认证项目。该测试项目由美国安全实验室(Underwriters Laboratories)执行,主要评估电池产品的安全性、性能和符合性。 适用家用及商用电池UL2054检测报告介绍|亚马逊UL2054报告 美国UL电池认证对电池标…

027:vue中两列表数据联动,购物车添加、删除和状态更改

第027个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

敦煌https证书能做些什么

随着互联网技术的不断发展,人们的生活方式和社交方式也发生了巨大的变化。互联网已经成为人们生活中不可或缺的一部分,它不仅提供了方便快捷的信息获取方式,还为人们提供了一个全新的社交平台。 然而,随着互联网的不断发展&#x…

工业设备状态监测中的声发射技术应用

工业设备状态监测是现代制造业和工业领域的重要一环,它能够帮助企业实时追踪设备的运行状况,及早发现潜在问题,采取预防性维护措施,以提高生产效率、降低维修成本,并确保工作场所的安全性。在这个领域,声发…

IT运维:使用数据分析平台监控H3C交换机

概述 在企业日常运维中,设备种类繁多,日志格式各异,日志量巨大,大量的告警,我们面临着如何统一的存放这些日志?如何对海量的日志进行查看,分析?传统的日志设备无法满足日志格式各异的…

lv3 嵌入式开发-10 NFS服务器搭建及使用

目录 1 NFS服务器介绍 1.1 NFS服务器的介绍 1.2 NFS服务器的特点 1.3 NFS服务器的适用场景 2 NFS服务器搭建 2.1 配置介绍 2.2 常见错误 3 WINDOWS下NFS服务器搭建(扩展) 1 NFS服务器介绍 1.1 NFS服务器的介绍 nfs(Network File Sys…

一道面试题:介绍一下 Fragment 间的通信方式?

Fragment 间的通信可以借助以下几种方式实现: EventBusActivity(or Parent Fragment)ViewModelResult API 1. 基于 EventBus 通信 EventBus 的优缺点都很突出。 优点是限制少可随意使用,缺点是限制太少使用太随意。 因为 Even…

Android T 窗口层级其三 —— 层级结构树添加窗口(更新中)

序 尚未添加窗口的层级结构树,如图 DisplayArea层级结构中的每一个DisplayArea,都包含着一个层级值范围,这个层级值范围表明了这个DisplayArea可以容纳哪些类型的窗口。 每种窗口类型,都可以通过WindowManagerPolicy.getWindowLa…

【LeetCode-中等题】78. 子集

文章目录 题目方法一&#xff1a;动态规划方法二&#xff1a;递归加回溯(关键----startIndex) 题目 注意&#xff1a;这里的nums数组里面的元素是各不相同的&#xff0c;所以不存在去重操作 方法一&#xff1a;动态规划 public List<List<Integer>> subsets(int[]…

linux编译curl库(支持https)

openssl下载和编译 https://www.openssl.org/source/old/ 解压 tar -xvf openssl-3.0.1.tar.gz cd openssl-3.0.1/配置 ./config如果是编译静态库加入 -fPIC no-shared 如果指定安装路径,使用 --prefix=/usr/local/openssl/选项指定特定目录 编译和安装 make sodu make i…

获取图像的属性、图像通道拆分合并实现

获取图像的属性 import numpy as np import cv2 as cv import matplotlib.pyplot as plt#绘制一个全黑的图像 img np.zeros((256,256,3),np.uint8) #创建图像时要指定类型为uint8 plt.imshow(img[:,:,::-1]) plt.show()#等待用户按任意键推出 cv.waitKey(0) cv.destroyAllWi…

基于改进二进制粒子群算法的含需求响应机组组合问题研究(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》第五章内容&#xff0c;主要做的是一个考虑需求响应的机组组合问题&#xff0c;首先构建了机组组合问题的基本模型&#x…

如何用SSH克隆GitHub项目

诸神缄默不语-个人CSDN博文目录 使用场景&#xff1a;由于不可知的网络问题&#xff0c;无法用HTTPS克隆GitHub项目。 报错fatal: unable to access https://github.com/PolarisRisingWar/llm-throught-ages.git/: GnuTLS recv error (-110): The TLS connection was non-pro…

Nginx__基础入门篇

目录: Nginx的优势 HTTP协议详解 Nginx部署-Yum Nginx配置文件 Nginx编译参数 Nginx基本配置 Nginx日志Log Nginx WEB模块 Nginx 访问限制 Nginx 访问控制 Nginx的优势 Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器&#xff0c;也是一个IM…

如何解决前端传递数据给后端时精度丢失问题

解决精度丢失 有时候我们在进行修改操作时&#xff0c;发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错&#xff0c;但是前端js将数据进行处理时却出错了&#xff0c;因为id是Long类型的&#xff0c;而js在处理后端返回给前端的Long类型数据…