搞懂mysql事物隔离级别

news2024/12/20 1:50:40

事物是为交易而生

事物的英文单词 TRANSACTION,就是交易的意思. 交易和事物是一个东西.

mysql的事物的4种隔离级别

mysql的事物隔离级设计的一点也不高级
隔离级别只是一个很烧脑的概念,并不是什么高大上的技术.

  1. RU,全称read-uncommitted, 中文翻译:读未提交,能够读到未提交的数据,就是不隔离
  2. RC,全称read-committed,中文翻译:读已提交,能读到已提交的数据.
  3. RR,全称repeatable-read,中文翻译:可重复读. 也有人管这个叫当前读.
  4. SERIALIZABLE,中文翻译:序列化,串行执行.

从上到下越来越严格,性能也越来越差.

mysql默认的隔离级是哪种?

默认是第三种,RR可重复读

隔离性是什么?

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。 即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

隔离的了什么?

隔离的是事物中间状态产生的数据.

  • 什么是中间状态?

一个事物中包含了多个sql, 还没有全部执行完成,只完成了一部分sql,还没有提交,这就是中间状态的数据. 隔离的就是这时候的数据. 这个时间虽然很短暂,但是程序并发执行的时候会出现,一个事物还未执行完,另一个事物就开始执行了,开始查数据了.

第二个事物是否可以看见第一个事物中已经修改了,但是还未提交的数据呢?这就是隔离级别考虑的问题.

选择哪个隔离级别呢

第一种 RU 完全不隔离, 会出现脏读,基本不用.

第四种完全实现了ACID,解决脏读、不可重复读、幻读,可保证事务安全,但完全串行执行,性能最低 ,由于性能太差,互联网应用并发大,一般不用.

然后剩下RR,RC. 都避免了脏读,事物更新数据后,还未提交时,对其他事物是不可见的.它们读到的是更新之前的数据.

RC 解决脏读的问题,存在不可重复读、幻读的问题

RR是mysql 默认级别,解决脏读、不可重复读的问题,存在幻读的问题。使用 MMVC机制 实现可重复读

  • RC,RR的区别是什么?

能不能可重复读.

  • 可重复读不可重复读有什么区别?

一个事物在执行过程中,能不能读到其他事物已经提交的事物对数据的更新呢?

如果能读到数据的变化,就是不可重复读,

如果不能读到数据的变化,就是可重复读.

  • 不可重复读是什么情况?

在同一个事务内两次读取同一条数据,读到的结果可能会不一样,这就是“不可重复读”。

  • 可重复读的情况是什么?

本次事物开启后, 其他事物对数据的修改 我也不管,就当看不见, 即使其他事物已经修改了数据,我再查询的时候,还是得到老数据.

这个隔离级别更高.

说的是本次事物可重复读.不受其他事物影响.

那么RC,RR选哪个?

其实选哪个都行,

有一个兼顾两种隔离级别的方案.

就是乐观锁, 数据表增加版本号字段, 先查数据,更新的时候限定更新where的条件带上查询到的版本号.

执行结果判断一下影响的结果行数要等于1才是更新成功.

因为即使where条件没有符合的数据,也不会返回失败.而是影响的结果为0.

就能防止在这个时候,其他事物突然更新了数据造成数据异常.

这样就控制了并发更新.

并发事物会出现哪些问题?

在事务的并发操作中可能会出现脏读,不可重复读,幻读。

什么是幻读?什么情况出现?

幻读会在 RU / RC / RR 级别下出现,SERIALIZABLE 则杜绝了幻读,

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

mysql 幻读的详解、实例及解决办法 - 个人文章 - SegmentFault 思否

锁 与 隔离级别

某个隔离级别默认带了某些锁,但是可以单独加锁.

update语句是会更新已提交的事物的数据.也就是对当前最新数据进行更新
update语句是自带for update的.

SERIALIZABLE 隔离级别下会隐式为你加行X锁
X是根据你的查询条件计算的行的范围

间隙锁是行锁的升级版,间隙锁比行锁范围大一点.

加锁的目的是防止当前事物被其他事物干扰.

也就是说,即使把所有的记录都加上锁,还是阻止不了新插入的记录,这也是为什么“幻读”会被单独拿出来解决的原因。

for update的bug

查询语句加上for update 会查询到当前数据库最新的数据, 其他事物已经提交的数据都能看到.

所以for update的查询也叫 当前读.

解决幻读

为了解决幻读问题,innodb引入了间隙锁(Gap lock).顾名思义,就是锁住两个值之间的空隙.

间隙锁容易导致死锁.

间隙锁在可重复读隔离级别下才有效

next-key lock 实际上是由间隙锁加行锁实现的。

当使用唯一索引来搜索唯一行的语句时,不需要间隙锁定。只使用行锁. 否则会使用间隙锁

如果,搜索条件里有多个查询条件(即使每个列都有唯一索引),也是会有间隙锁的。

幻读还是很难解决的,

可以用乐观锁解决.

MVVC

相当于一个快照

MVCC(Multi Version Concurrency Control的简称),代表多版本并发控制。与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。

MVCC最大的优势:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能

原理:一致性视图, InnoDB 在实现 MVCC 时用到的一致性读视图,即 consistent read view,用于支持 RC(Read Committed,读提交)和 RR(Repeatable Read,可重复读)隔离级别的实现。

这个视图不是那个我们可以自己创建的视图,是两个概念.

数据表中的一行记录,其实可能有多个版本 (row),每个版本有自己的 row trx_id 作为版本号 来区分.

mysql里面很多概念理解起来很烧脑.都是为了解决一些问题造出了一堆概念,解决一个老问题就会产生一个新问题,如此循环无穷尽也.

 

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

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

相关文章

static关键字在C语言中的作用

static关键字有三个主要作用: 1.修饰全局变量 2.修饰函数 3.修饰局部变量 (1)首先是修饰全局变量,就是变量只能在本文件中使用,不能在其他文件中使用 代码示例:vi 1.c vi 2.c 编译:gcc 1.c 2.c -o main ./main …

指定数组的维度,返回由随机数构成的数组numpy.random.ranf()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 指定数组的维度, 返回由随机数构成的数组 numpy.random.ranf() 选择题 以下说法错误的是? import numpy as np print("【执行1】np.random.ranf()") print(np.random.ra…

Redis整合jedis 学习

前言 redis简单来讲是内存数据库,因为是将数据存放到内存,因此读写速率高快(传统数据库,不是先从内存转到硬存,慢) 1.jedis连接Redis redis是java操作redis的客户端,通过他我们能通过java语句操控redis。 jedis对于…

Vue使用Echarts折线图,实现点击播放、暂停、选择播放倍数;实现数据直播功能

文章目录 🌟前言🌟先看效果🌟整体代码(详细注释)🌟写在最后 🌟前言 哈喽小伙伴们,最近公司有个小需求,就是基于Echarts的折线图,做一个数据直播的功能&#…

manacher(图文详解)

文章目录 简要介绍实际应用算法详解 简要介绍 马拉车算法,Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法,是一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性O(N)。 实际应用 刷…

玩转脚本实现自动化

目录 前言: 自动化原理 前置和后置脚本的区别(它们的功能就如同名字一样) 淘宝联盟接入文档 签名算法 调用示例 配置环境参数 设置全局变量 设置相关环境下的服务器地址 开始分析参数指定规则 添加接口 前言: 自动化测…

shell索引数组变量-定义获取拼接删除

目录 介绍数组的定义演示 数组的获取数组的拼接演示: 数组的删除 介绍 Shell 支持数组(Array), 数组是若干数据的集合,其中的每一份数据都称为数组的元素。 ( 注意Bash Shell 只支持一维数组,不支持多维数组…

如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?

我们知道整个ASP.NET Core建立在以ServiceCollection/ServiceProvider为核心的DI框架上,它甚至提供了扩展点使我们可以与第三方DI框架进行整合。对此比较了解的读者朋友应该很清楚,针对第三方DI框架的整合可以通过在定义Startup类型的ConfigureServices方…

大学毕业生自荐信范文

大学毕业生自荐信范文1 尊敬的贵公司领导: 您好! 首先感谢您对我的关注,在我即将走出校门的时候,给我一次宝贵的工作机会。 学习了两年的会计专业相关知识后,已经使得我对会计行业有了深刻的认识。技能要靠经验&#x…

7.OpenCV-图像轮廓

1.通过OpenCV的findContours可以很方便的找到图片中内容的轮廓。 2.为了提取轮廓有更高的准确率,在提取轮廓前,需要对图片进行预处理(二值阈值),只保留感兴趣的图像。 3.通过计算轮廓面积与外接矩形或外接圆的面积&a…

2023年6/16 操作系统小知识点

目录 分值第二章1. 进程状态转化的条件2. 进程控制块概念,作用,构成。3. 进程上下文概念,组成4. 进程的创建过程以及步骤5. 作业调度和低级调度算法,基本思想,7个,都要掌握6. 线程概念和处理过程7. 为什么有…

【玩转Docker小鲸鱼叭】虚拟化技术是什么?

到底什么是虚拟化? Docker 是一款基于容器虚拟化技术构建的软件,那到底什么虚拟化技术呢?在学习Docker之前,先简单了解下虚拟化技术。 虚拟化是云原生的实现基础,它能够帮助我们更加有效地利用物理计算机硬件。 虚拟…

德国Kipu Quantum与法国Pasqal合作优化量子算法

​ (图片来源:网络) 6月12日,德国量子软件公司Kipu Quantum宣布与法国中性原子量子计算领域的领导者PASQAL达成为期两年的研发协议,以优化量子算法功能,并为企业加速带来量子效益。 Kipu Quantum专注于为特…

Pytest教程__allure报告(11)

一、allure工具环境配置 windows安装allure 1、下载allure工具包 进入工具包官网:https://github.com/allure-framework/allure2/releases 2、解压下载包 3、将解压包的bin目录路径添加到环境变量中 4、打开cmd命令行输入 allure --version 确认是否安装成功 lin…

文件从 UNIX(LF) 批量改为 PC(CR+LF) ,编码格式保持源文件编码,CMD转换成功

如何把文件从 UNIX(LF) 批量改为 PC(CRLF) ,编码格式保持源文件编码,通过电脑自带cmd 批量更改-1.0 chcp 65001 && FOR /F "tokens*" %f IN (dir /b D:\opt\output\DATA_FILE\20230531\*.DAT) DO type "D:\opt\output\DATA_FILE…

经典的设计模式21——策略模式

文章目录 策略模式 猛的发现策略模式和状态模式的结构图长得到好像,可得好好区分区分。 不过真的好像,就是方法那里传递的参数不一样。 百度来一波。 策略模式 定义: 定义了算法家族,分别封装起来,让他们之间可以互…

数字电路基础---锁存器

目录 锁存器 1、简介 2、实验任务 3、程序设计 3.1、缺少 else 分支的锁存器代码 3.2、补齐 else 分支 3.3、缺少 default 的 case 语句的锁存器代码 3.3、补齐 default 的 case 语句 4、本章总结 锁存器 锁存器(俗称 Latch)是数字电路中的一种…

别让存储成为ChatGPT大模型训练的关键瓶颈

当下科技行业be like... 据说现在的科技公司,不是在抢GPU,就是在往抢GPU的路上……此前4月,特斯拉CEO马斯克就购买了1万块GPU,他还称公司将继续大量购买英伟达的GPU。 在国内,近日也有报道称,字节跳动今年…

MySQL数据库事务和存储引擎(贼详细)

目录 一、MySQL 事物 1、事务的概念 2、 事务的ACID特点 (1)原子性 (2)一致性 (3) 隔离性 (4)事务之间的相互影响 (5) Mysql及事物隔离级别 &#…

你知道视频配音怎么配出好听的声音吗

小明:最近我在制作一个视频项目,但是我发现视频中的原声不够理想,我想给它配上好听的声音。你知道怎么配音才能让声音听起来更好吗? 小李:当然!配音是提升视频质量的重要一环。想知道视频配音怎么配出好听…