mysql事务 -- 事务的隔离性(测试实验+介绍,脏读,不可重复读,可重复度读,幻读)

news2024/11/26 0:32:30

目录

事务的隔离性

引入

测试

读未提交

脏读

读提交

不可重复读

属于问题吗?

例子

可重复读

幻读

串行化

原理

总结


事务的隔离性

引入

当我们让两个客户端共同执行begin语句时,就开始了两个事务并发访问

  • 在这个过程中,可能会出现sql交叉的问题

但我们不希望因为交叉产生问题,又因为事务是原子的

  • 那么,我们就不应该让客户端看见其他客户端在事务执行过程中产生的若干中间结果
  • 相当于是原子操作的中间过程被其他人看见了,这违背了事务的隔离性

我们下面的测试都是针对执行中的事务

  • 因为事务是有执行过程的
  • 我们为了解决在这个过程中出现的并发等问题,才设置了各种事务的特性

 

接下来,我们用边实验,边介绍的方式,来认识这四个隔离级别的特点和问题

测试

读未提交

当我们使用读未提交的方式,会发现在事务还没有提交的时候,操作结果就会被其他客户端看见

  • 这就是读 未提交的表现,但这样的表现并不合理
脏读

一个事务在执行过程中,可以读取到另一个执行中的事务更新了但还未提交的数据

  • 一般不建议采用这种方式
  • 因为脏读现象并不合理,它完全破坏了事务的隔离性
  • 还没提交就看见了,那岂不是会读到很多垃圾数据,要是别人一个回滚,之前读到的就是不真实的数据

读提交

更换两个客户端的隔离级别都为读提交后,还是启动两个事务,依然在一方插入数据,另一方查看时发现还是原始数据:

虽然其他客户端查看不到,但实际上已经被写入数据库了

当客户端1的事务提交后,客户端2就可以查看到被客户端1更新后的数据了:

  • 注意,这里是在客户端2启动的[事务还没有结束]的时候进行查看的

这就是读 提交的隔离级别,只要客户端的事务一提交,就能被其他客户端看见,即使是在事务执行过程中

  • 也就是说,其他客户端看见的不一定是最新的数据

看不见最新数据,就一定是错的吗?

  • 不是
  • 就像以前的人们无法在那时就看见现在的世界,出生和死亡时间的限制,就注定了每个人看见的世界可能是不一样的
  • 每个客户端看到的数据不一样,才是合理的
不可重复读

在客户端2启动的事务还未提交时,可以看到其他客户端的提交结果

  • 就造成了,在一个事务内部,调用同样的select语句,会出现不同的数据 -- 不可重复读 
  • 这里的不可重复读,重点在于修改和删除(原因在后面介绍)

在多个事务并发执行时,无法确保查看的数据不变,导致无法重复调用select

  • 因为查看到的数据是不一样的
  • 而这些不一样的数据可能会影响上层的决策
属于问题吗?

有这样的现象没错,但这属于问题吗?

  • 理论上确实是一个问题

理论上事务是不会被其他事务干扰的

  • 所以不应该会出现查询出的结果不同
  • 提交后的结果可以被看见,但不能被正在执行的事务看见
  • 也就是读提交会破坏客户端2的隔离性
例子

假设有一个场景,某公司需要根据工资来决定年终奖

  • 那么就需要找到不同工资范围的员工

于是员工1将这件工作封装成了一个事务来完成:

如果此时临时有员工的工资发生变动(tom的工资从3200变成4500),需要一个员工2去完成修改:

  • (单sql本质上也是事务,写成这样更明确一些)

然后就是很巧的,在员工1在执行第二条sql到第三条sql之间,员工2完成了修改并提交

  • 那么员工1查出来的结果中,会出现两个tom -- 因为工作在读提交的隔离级别下,一旦有事务完成,其他客户端都可以看见修改后的结果

而这不符合常理

  • 因为一个人只有一个工资
  • 但因为不可重复读的特性,导致在事务内部进行多次查找时出现了不同结果,从而对业务带来了影响

对员工1来说

  • 在他进行筛选时,员工工资就不应该发生变化了,不然还怎么筛选呢?
  • 所以,读提交的隔离级别是有问题的,当然,在读未提交中这样的问题更为严重

所以,一定要保证事务的隔离性,不应该被其他执行的事务影响

  • 所以,我们依然不推荐使用读提交的隔离级别,它依然没有保证事务的隔离性
  • 于是我们有了第三种隔离级别,来解决这个问题

可重复读

继续更改隔离级别,然后重复前面的实验

只有当自己结束事务后,才能看见其他客户端更新的数据:

符合可重复读的特点

幻读

但其他数据库在可重复读的情况时,无法屏蔽insert后带来的数据

  • 因为隔离性是通过对数据加锁实现的,而insert插入的数据原本并不存在,所以无法屏蔽
  • 所以就会导致多次查找时,会出现新数据,就如同产生了幻觉(就明明已经是可重复读了,却还是有不一样的数据) -- 幻读现象
  • 所以,幻读的重点在于新增

也可以将幻读问题和不可重复读放在一起理解

  • 本质都是会导致多次查找的结果不同

而这里,mysql很显然是解决了幻读问题,它真正实现了,在多个事务并发执行时互相不影响 

  • 解决方法 -- next-key锁
  • 所以mysql以可重复读隔离级别作为默认级别

串行化

将所有事务串行化

  • 也就是要让事务按照到来顺序排队
  • 同一时刻只有一个事务在运行,可以保证mysql数据的绝对完整性和安全性

但这样会带来严重的效率问题

修改隔离级别:

依然是启动两个事务,都在查询的时候没有问题:

如果其中一方对数据做了修改/进行了查询,就会拦住另一个的修改操作(阻塞住,不会执行sql语句),并设置超时时间:

直到那一个提交事务后,才会让被拦住的那个执行:

只有在提交事务后,其他事务才能看见更新的数据

原理

当其中一个事务在进行查询时,会在持有锁的状态下访问表

  • 如果其他事务也想要查询,可以
  • 但其他事务如果想要对表进行修改,只能先在等待队列中等待,直到持有锁的客户端结束事务

总结

隔离级别越严格,安全性越高,并发效率越低

  • 具体使用哪种,由业务需求来决定
  • mysql只需要提供多种隔离级别让用户做选择就好

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

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

相关文章

项目定位与服务器(SERVER)模块划分

目录 定位 HTTP协议以及HTTP服务器 高并发服务器 单Reactor单线程 单Reactor多线程 多Reactor多线程 模块划分 SERVER模块划分 Buffer 模块 Socket模块 Channel 模块 Connection模块 Acceptor模块 TimerQueue模块 Poller模块 EventLoop模块 TcpServer模块 SE…

【ADC】噪声(1)噪声分类

概述 本文学习于TI 高精度实验室课程,总结 ADC 的噪声分类,并简要介绍量化噪声和热噪声。 文章目录 概述一、ADC 中的噪声类型二、量化噪声三、热噪声四、量化噪声与热噪声对比 一、ADC 中的噪声类型 ADC 固有噪声由两部分组成:第一部分是量…

【树莓派系列】树莓派wiringPi库详解,官方外设开发

树莓派wiringPi库详解,官方外设开发 文章目录 树莓派wiringPi库详解,官方外设开发一、安装wiringPi库二、wiringPi库API大全1.硬件初始化函数2.通用GPIO控制函数3.时间控制函数4.串口通信串口API串口通信配置多串口通信配置串口自发自收测试串口间通信测…

Django 后端数据传给前端

Step 1 创建一个数据库 Step 2 在Django中点击数据库连接 Step 3 连接成功 Step 4 settings中找DATABASES Step 5 将数据库挂上面 将数据库引擎和数据库名改成自己的 Step 6 在_init_.py中加上数据库的支持语句 import pymysql pymysql.install_as_MySQLdb() Step7 简单创建两…

以企业的视角进行大学生招聘

课程来源:中国计算机学会---朱颖韶(资深人力资源领域--HR) 一、招聘流程 1.简历->门槛 注重:专业学历、行业经验 2.笔试面试->专业知识与技能 3.简历面试-> 过往的成果 4.面试 沟通能力、学习力-----了解动机、价值观…

Pikachu-Sql Inject-insert/update/delete注入

insert 注入 插入语句 insert into tables values(value1,value2,value3); 如:插入用户表 insert into users (id,name,password) values (id,username,password); 当点击注册 先判断是否有SQL注入漏洞,经过判断之后发现存在SQL漏洞。构造insert的pa…

8644 堆排序

### 思路 堆排序是一种基于堆数据结构的排序算法。堆是一种完全二叉树,分为最大堆和最小堆。堆排序的基本思想是将待排序数组构造成一个最大堆,然后依次将堆顶元素与末尾元素交换,并调整堆结构,直到排序完成。 ### 伪代码 1. 读取…

自闭症干预寄宿学校:专业治疗帮助孩子发展

自闭症干预寄宿学校:星贝育园的专业治疗助力孩子全面发展 在自闭症儿童的教育与康复领域,寄宿学校以其独特的教育模式和全面的关怀体系,为众多家庭提供了重要的选择。广州星贝育园自闭症儿童寄宿制学校,作为这一领域的佼佼者&…

达梦core文件分析(学习笔记)

目录 1、core 文件生成 1.1 前置条件说明 1.2 关于 core 文件生成路径的说明 1.3查看 core 文件的前置条件 2、查看 core 文件堆栈信息 2.1 使用gdb 2.2 使用达梦dmrdc 3、core 分析过程 3.1 服务端主动 core 3.2因未知异常原因导致的 core 4、测试案例 4.1测试环境…

(十八)、登陆 k8s 的 kubernetes-dashboard 更多可视化工具

文章目录 1、回顾 k8s 的安装2、确认 k8s 运行状态3、通过 token 登陆3.1、使用现有的用户登陆3.2、新加用户登陆 4、k8s 可视化工具 1、回顾 k8s 的安装 Mac 安装k8s 2、确认 k8s 运行状态 kubectl proxy kubectl cluster-info kubectl get pods -n kubernetes-dashboard3、…

网页前端开发之Javascript入门篇(4/9):循环控制

Javascript循环控制 什么是循环控制? 答:其概念跟 Python教程 介绍的一样,只是语法上有所变化。 参考流程图如下: 其对应语法: var i 0; // 设置起始值 var minutes 15; // 设置结束值(15分钟…

Stream流的终结方法(一)

1.Stream流的终结方法 2.forEach 对于forEach方法,用来遍历stream流中的所有数据 package com.njau.d10_my_stream;import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.Consumer; import java.util…

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo

安全帽头盔检测数据集 3类 12000张 安全帽数据集 voc yolo 安全帽头盔检测数据集介绍 数据集名称 安全帽头盔检测数据集 (Safety Helmet and Person Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型(包括YOLOv5、YOLOv6、YOLOv7…

SpringCloud入门(十一)路由过滤器和路由断言工厂

一、路由过滤器 路由过滤器( GatewayFilter )是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理: 如图:网关路由过滤器: 路由过滤器的作用是: 1.对路由的请求或响应做加…

第二十章(自定义类型,联合和枚举)

1. 联合体类型的声明 2. 联合体的特点 3. 联合体⼤⼩的计算 4. 枚举类型的声明 5. 枚举类型的优点 6. 枚举类型的使⽤ 光阴如骏马加鞭一、联合体 概念:像结构体一样,联合体也是由一个或者多个成员组成的,这些成员也可以是不同的类型。 …

JavaSE篇:文件IO

一 认识文件 在硬盘这种持久化存储的I/O设备或其他存储介质中 ,当我们想要进行数据保存时,往往不是保存成⼀个整体,⽽是独⽴成⼀个个的单位进⾏保存,这个独⽴的单位就被抽象成⽂件的概念。就类似办公桌上的⼀份份真实的⽂件⼀般。…

疾风气象大模型如何预测气象数据,预测数据怎么获得

随着科技的快速发展,人工智能和大数据技术逐渐渗透到各个领域,气象预测也不例外。过去,气象预测主要依赖于物理模型,结合大气、海洋、陆地等系统的观测数据,通过复杂的数值计算来推测未来天气。而如今,大模…

八、跳跃、闪避

一、人物跳跃功能 1、动画 设置一个bool值 条件设置为true 2、逻辑 实现跳跃,一定有IsGround;判断是否为地面,进行跳跃功能 写一个跳跃和一个条约结束方法 跳跃设置为false,结束设置为true 3、代码 public void Jump() {if…

Ray_Tracing_In_One_Weekend下

1Lambertian漫反射材质 一个物体的材质,可以分成两部分来看,因为物体没有绝对光滑和绝对粗糙 漫反射:由于物体粗糙,那么对于微小平面,光线会向四周反射,光源的一部分光线传回人眼 镜面反射:假…

C++ 类和对象的初步介绍

文章目录 1.面向过程和面向对象的初步认识2.类的引入3.类的定义4. 类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化 1.面向过程和面向对象的初步认识 C语言是面向过程的,关注的过程,分析出求解问题的步骤,通过函数调用…