mysql事务 -- 事务的隔离性(测试实验+介绍,脏读,不可重复读,可重复度读,幻读),如何实现(RR和RC的本质区别)

news2024/10/5 15:11:14

目录

事务的隔离性

引入

测试

读未提交

脏读

读提交

不可重复读

属于问题吗?

例子

可重复读

幻读

串行化

原理

总结


事务的隔离性

隔离性的理解 -- mysql事务 -- 如何理解事务,四个属性,查看是否支持事务,事务操作(提交方式,事务的开始和回滚,提交),事务的隔离性(如何理解,隔离级别概念,如何查看/设置)-CSDN博客

引入

当我们让两个客户端共同执行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只需要提供多种隔离级别让用户做选择就好

如何实现

隔离,基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的

(这里我们只是简单理解下)

第一种和第四种都好理解

  • 读未提交 -- 直接读取其他事务的当前数据状态
  • 串行化 -- 对所有读操作加锁

读提交和可重复读该如何实现呢? -- 通过MVCC和锁机制实现

其中,二者的本质区别,以及MVCC的介绍 -- 

mysql事务 -- MVCC多版本控制介绍(模拟过程),版本链(清理机制,不同操作对应的版本链),可见性判断(是否应该看见,源码,比较过程),RC和RR的本质区别(如何实现)-CSDN博客

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

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

相关文章

(Django)初步使用

前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架,适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档,使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…

基于单片机的智能浇花系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采样DHT11温湿度传感器检测温湿度,通过LCD1602显示 4*4按键矩阵可以设置温度湿度阈值,温度大于阈值则开启水泵,湿度大于阈值则开启风扇…

从零开始讲PCIe(6)——PCI-X概述

一、概述 PCI-X 在硬件和软件上与 PCI 具有向后兼容性,同时提供了更高的性能和效率。它使用与 PCI 相同的连接器格式,因此 PCI-X 设备可以插入 PCI 插槽,反之亦然。而且,PCI-X 采用相同的配置模型,因此在 PCI 系统上运…

Apollo9.0 Planning2.0决策规划算法代码详细解析 (4): PlanningComponent::Proc()

🌟 面向自动驾驶规划算法工程师的专属指南 🌟 欢迎来到《Apollo9.0 Planning2.0决策规划算法代码详细解析》专栏!本专栏专为自动驾驶规划算法工程师量身打造,旨在通过深入剖析Apollo9.0开源自动驾驶软件栈中的Planning2.0模块&am…

webpack插件 --- webpack-bundle-analyzer【查看包体积】

const UglifyJsPlugin require(uglifyjs-webpack-plugin) // 清除注释 const CompressionWebpackPlugin require(compression-webpack-plugin); // 开启压缩// 是否为生产环境 const isProduction process.env.NODE_ENV production; const { BundleAnalyzerPlugin } requi…

大数据可视化分析建模论

大数据可视化分析建模论 前言大数据可视化分析建模 前言 在这个信息爆炸的时代,数据如同潮水般涌来,我们每天都在与海量的数据打交道。数据已经成为了企业决策、科研创新以及社会发展的核心要素。如何从这些纷繁复杂的数据中提取有价值的信息&#xff0…

C++多态、虚函数以及抽象类

目录 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1实现多态还有两个必要条件 2.1.2虚函数 2.1.3虚函数的重写/覆盖 2.1.4多态场景的题目 2.1.5虚函数重写的一些其他问题 2.1.5.1协变(了解) 2.1.5.2析构函数的重写 2.1.6override和final关键字 2.…

【Java】JAVA知识总结浅析

Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景&…

《业务三板斧:定目标、抓过程、拿结果》读书笔记2

为什么要看懂“目标全景图”? 很多管理者在定目标时缺乏全局思维,“只见树木,不见森林”,导 致定出来的目标短浅,管理者如井底之蛙。“目标全景图”是企业的 整个目标体系,如图1-1所示。管理者看懂“目标全…

Pikachu- Over Permission-垂直越权

以admin 账号登陆,添加一个用户; 把添加用户的这个请求发送到 repeater; 退出admin,使用普通用户pikachu登陆; 只有查看权限; 使用pikachu 用户的认证信息,替换repeater处管理员创建用户请求的…

【电力系统】配电网前推后带法求电力系统潮流

摘要 在配电网潮流计算中,前推后带法是一种常用的算法,适用于径向结构配电网。本文通过详细介绍前推后带法的基本原理和计算流程,并结合实际实验结果展示了该方法在电力系统中的应用。实验结果表明,该方法在潮流计算中具有较高的…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多,因此拆成2个章节,本章节是第二章节&…

CSS元素显示类型

display 属性是 CSS 中最重要的属性之一&#xff0c;主要用来控制元素的布局&#xff0c;通过 display 属性您可以设置元素是否显示以及如何显示。 根据元素类型的不同&#xff0c;每个元素都有一个默认的 display 属性值&#xff0c;例如<div>默认的 display 属性值为 …

Pandas基础学习

导入 导入pandas一般是这样导入的 import pandas as pdSeries 创建 s1 pd.Series([5, 17, 3, 26, 31])注意Series的第一个字母要大写&#xff0c;表明这其实是Series类的构建函数, 返回的是Series类的实例 获得元素或者索引 单独获得元素 s1.values单独获得索引值 s…

基于springboot的校园物流管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的校园物流管理系统1拥有两种角色 管理员&#xff1a;物流管理&#xff08;揽件、寄出&#xff09;、用户管理等 用户&#xff1a;收件、寄件、个人物流信息管理等 1.1 …

proto3语法

文章目录 字段规则消息类型定义与使用序列化写入文件hexdump工具反序列化读取文件decode命令选项enum类型设置电话类型 Any类型设置地址信息 oneof类型设置其他联系人信息 map类型添加备注信息 默认值更新消息更新规则 未知字段输出未知字段消息 option选项常用选项 本章代码仓…

Leetcode 剑指 Offer II 097.不同的子序列

题目难度: 困难 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列…

NVIDIA网卡系列之ConnectX-5规格信息(100G-PCIe 3.0x16-8PF512VF-2016年发布)

背景 NVIDIA ConnectX-5系列的网卡&#xff0c;早期还在Mellanox未被NVIDIA收购的时候就发布了&#xff0c;主流支持100G&#xff0c;主要用在PCIe3.0&#xff0c;最大支持200G的产品。虽然已经发布多年&#xff0c;但是目前还是在大量使用。100Gbps的速率对比普通网卡来讲&am…

基于SSM的电影院售票系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 前言 近些年的电影在人们文娱活动中占据重要地位&#xff0c;另外&#xff0c;由于人们的生活越来越富有&#xff0c;越来越多的人们不再选择在家里看电影&#xff0c;而是选择去电影院看电影。但是&#xff0c;以往的售票方式是…

在Visual Studio中使用CMakeLists.txt集成EasyX库的详细指南

EasyX库是一款专为Windows平台设计的轻量级C图形库&#xff0c;适合初学者和教育领域使用。结合Visual Studio和CMake工具链&#xff0c;用户可以轻松创建C项目&#xff0c;并集成EasyX库&#xff0c;实现丰富的图形编程效果。本文将详细介绍如何在Visual Studio中通过CMakeLis…