• 自动秒收录
  • 软件:1973
  • 资讯:57811|
  • 收录网站:279851|

IT精英团

如果有人问你MySql的隔离级别是什么 把这篇文章发给他!

如果有人问你MySql的隔离级别是什么 把这篇文章发给他!

浏览次数:
评论次数:
编辑: 乐咏
信息来源: ITPUB
更新日期: 2021-06-04 16:31:07
摘要

首先要明白什么是事务?事务是程序中一系列严密的操作,所有的操作必须完成,否则在所有的操作中所做的所有的更改都会被撤销。也就是事务的原子性,一个事务中的一系列的操作要么全部成功,要么就是失败。事务的结束有两种,当事务中所有的步骤全" />

  • 正文开始
  • 相关阅读
  • 推荐作品

作者lzyz 1992来自lhollis(id:Hollis Chuang)首先要明白什么是事务?事务是一个由一系列严格操作组成的程序,所有操作必须完成,否则所有操作中所做的所有更改都将被撤销。也就是事务的原子性。事务中的一系列操作要么成功,要么失败。

交易结束有两种。当事务中的所有步骤成功执行时,事务被提交。如果其中一个步骤失败,将会发生回滚操作,在事务开始之前反转所有操作。

事务的ACID事务有四个特点

原子事务是数据库的逻辑工作单元,它包含多个操作,要么全部完成,要么没有完成。

隔离(隔离也是本文的重点)事务不能相互干扰,即一个事务的操作与数据库的其他事务操作隔离,并发执行的每个事务相互干扰

一旦持久事务被提交,它的改变是永久性的

一致事务执行的结果必须从一种状态变为另一种状态,所以当数据库只包含事务提交成功的结果时,就说数据库处于一致状态。如果数据库系统在操作过程中失败,一些未完成的事务被迫中止,一些修改被写入数据库,则数据库处于不正确的状态。

实际上,以上三个条件(原子性、隔离性和持久性)最终都是为了保持数据库数据的一致性。MySQL的四种隔离级别SQL标准定义了四种隔离级别,用来限定事务内外的哪些改变是可见的,哪些是不可见的。读取未提交的数据。在这个隔离级别,所有事务都可以看到其他事务未提交的执行结果。(实际生产中不可能使用这种隔离级别)

[Read Committed]这个隔离级别是大多数数据库的默认隔离级别(不是MySQL默认)。它满足隔离:的简单定义。一个事务只能看到其他提交的事务所做的更改。该隔离级别还支持不可重复读取,即相同的选择可能得到不同的结果

重新读取【可重复读取】这是MySQL的默认隔离级别,保证同一事务并发读取数据时会看到同一条数据线。但是,会导致理论上的另一个问题,“魔法阅读”。幻读:在相同条件下查询部分数据,然后其他交易在此条件下【增加】或【删除】数据,导致不同的读取结果。InnoDB存储引擎通过多版本控制(MVCC)机制解决了这个问题

Serializable [Serializable]这是事务的最高隔离级别。它通过强制事务排序,使它们不能相互冲突,从而解决了魔法阅读的问题。它为每个读取的数据线添加一个共享锁。但是,它可能会导致超时和锁争用(这种隔离级别过于极端,实际生产中基本不使用)

这四种隔离级别采用不同的锁类型来实现脏读读取前一事务的未提交或回滚的数据

选择查询具有相同的不可重复性,但结果不同,并且一些事务在此过程中会更新原始数据

魔读两个查询的结果数量不一样,过程中增加或删除了一些事务

以下是由不同隔离级别引起的不同问题的摘要

各个隔离级别的详细测试图检查数据库的隔离级别,显示类似“%isolation%%”的变量

设置数据库setsessiontransactionis的隔离级别

olation level Read Uncommitted;

设置数据库的隔离级别为:Read Uncommitted

实验一:Read Uncommitted

Read Uncommitted 即:读取未提交前置条件:将数据库的隔离级别设置为read uncomitted;

set session transaction isolation level Read Uncommitted;


img
img
第一步:A开启事务:start tracsaction;
img
第二步:A查询数据:select * from test;
img
第三步:B开启事务:start transaction;
img
第四步:B查询数据:select * from test;
img
第五步:B更新数据:update test set num =10 where id = 1;B没有提交事务
img
第六步:A读取数据----A读取到了B未提交的数据(当前数据库的隔离级别是:Read Uncommitted
img
第七步:B回滚数据:rollback;
img
第八步:B查询数据:select * from test;
img
第九步:A查询数:select * from test;
img
结论:事务B更新了数据,但是没有提交,事务A读取到的是B未提交的记录。因为造成脏读。Read Uncommitted是最低的隔离级别

实验二:读取已提交-Read Committed

前置条件:将数据库的隔离级别设置为:Read Committed;

set session transaction isolaction level Read Committed;


img
img
第一步:A开始事务:start transaction;
img
第二步:A查询数据:select *from test;
img
第三步:B开启事务:start transaction;
img
第四步:B查询数据:select * from test;
img
第五步:B更新数据:update test set num =10 where id=1查看结果:
img
第六步:A查询数据:select * from test;
img
第七步:B提交数据:commit;
img
第八步:A查询数据:select * from test;
img
结论:Read Committed 读已提交的隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的结果不一致,因为在两次查询之间事务B更新了一条数据。读已提交的只允许读取已经提交的记录 ,但是不要求可重复读

实验三:可重读度-Repeatable Read

前置条件:将数据库的级别设置为可重复度set session transaction isolation level repeatable read;
img
第一步:A开始事务:start transaction;
img
第二步:A查询数据:select * from test;
img
第三步:B开启事务:start transaction;
img
第四步:B查询数据:select * from test;
img
第五步:B更新数据:update test set num=10 where id=1;
img
此时B并没有提交事务第六步:B查询数据:select * from test;
img
第七步:A查询数据
img
结果仍然是之前的结果(因为B事务还没有提交)第八步:B提交事务:commit;
img
第九步:A查询数据:select * from test;此时A查询的记录仍然和之前一样
img
第十步:B插入一条数据并提交事务:inset into test(num) value(4);
img
第十一步:A查询数据,发现结果还是和之前的一样:select * from test;
img
第十二步:A提交事务并查询数据
img
此时发现A查询的数据已经和B查询的结果一致了;结论:Repeatable Read隔离级别只允许读取已经提交的事务的记录,

实验四:串行化-Serializable

前置条件:将数据库的隔离级别设置为可串行化
img
第一步:A开始事务并查询数据
img
第二步:B开启事务并insert数据,发现只能等待,并不能执行下去
img
第三步:A提交事务
img
第四步:B插入数据
img
结论:serializable完全锁定字段,若一个事务来操作同一份数据,那么就必须等待,直到前一个事务完成并解除锁为止。是完整的隔离级别,会锁住对应的数据表,因为会导致效率问题。


本文小结本片文章并没有深入的去讲解原理,而是让大家能够从更直观的从隔离级别的表面去了解隔离级别,因为我发现我的很多同事对此是模模糊糊,模棱两可的,但是这个是不可以的,因为技术本身是不允许存在这种歧义的,懂就是懂,才能合理运用,如果模棱两可,那么在实际运用中一定也是漏洞百出,所以这也是这篇文章诞生的原因。我们可以先抛开原理与底层的具体实现,先能够清晰且明了的搞清楚各个专业术语的含义,这未尝不是一种进步。最后以一句不积跬步无以至千里,不积小流无以成江河与诸君共勉!
标签:事务 数据 级别
Nginx通过启用ssl会话重用可以提高多少性能?
« 上一篇 2021-06-04
RAC环境下如何修改监听端口
下一篇 » 2021-06-04
  • 如何在Ubuntu中保留文件系统并备份当前开发板镜像
    0阅读 0条评论 个赞
    在Ubuntu保留文件系统或者说备份当前开发板镜像的需求在不断增加。比如Ubuntu文件系统需要安装库文件的话直接使用apt-get工具就可以下载,但由于需要下载的核心板较多,比较费时间,这时需要将安……
  • 国产核心板全志T507助力消防系统升级
    0阅读 0条评论 个赞
    9月16日下午,位于湖南长沙市区内的中国电信大楼发生火灾,建筑高度218米,现场浓烟滚滚,数十层楼体燃烧剧烈。消防救援人员赶到现场后很快将火势控制住,目前大楼火势已被扑灭,所幸未发现人员伤亡。湖南电信……
  • 教大家如何处理Spring Boot易流中的用户和群体!
    0阅读 0条评论 个赞
    1.准备工作2.用户操作2.1添加用户2.2修改用户2.3删除用户2.4查询用户3.组操作3.1添加组3.2修改组3.3删除组3.4查询组4.查看表详情虽然说我们在实际开发中,……
  • 从PG15开始WAL压缩优化
    0阅读 0条评论 个赞
    PG15传闻中的超级令人激动的功能大多数跳票了,年初我也写过一个关于PG15新功能跳票的文章。PG15BETA已经发出几个月了,似乎PG15里令人激动人心的功能不多,不过从长长的新功能列表里,……
  • 深入了解美团叶子发射器开源方案
    0阅读 0条评论 个赞
    大家好,我是树哥。之前我们有聊过「如何设计一个分布式ID发号器」,其中有讲过4种解决方案,分别是:UUID类雪花算法数据库自增主键Redis原子自增美团以第2、3种解决方案为基础,开发出……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • 自动化测试选择Python还是Java?
    0阅读 0条评论 个赞
    你好,我是测试蔡坨坨。今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言。前言自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的趋势。……
  • 我们能从AlloyDb的架构中学到什么
    0阅读 0条评论 个赞
    前些天我发了一篇解读信通所分布式数据库发展报告内容的文章,有些朋友对我把Aurora、AlloyDB、PolarDB等也归类于分布式数据库感到有些不解。实际上这是信通所在报告里的归类,和国际上的常见归……
  • 计算机网络-了解-DNS和HTTPDNS
    0阅读 0条评论 个赞
    DNS和HTTPDNSDNS域名解析的过程传统DNS存在的问题1、域名缓存问题2、域名转发问题3、出口NAT问题4、DNS域名更新问题5、解析延迟问题6、运营商劫持HTTPDNSHTTP……
  • 你知道信息架构图和功能架构图的区别吗?
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • ASP.NET核心6框架揭示示例演示[34]:缓存整个响应内容
    0阅读 0条评论 个赞
    我们利用ASP.NET开发的大部分API都是为了对外提供资源,对于不易变化的资源内容,针对某个维度对其实施缓存可以很好地提供应用的性能。《内存缓存与分布式缓存的使用》介绍的两种缓存框架(本地内存缓存和……
  • Sql Server连接池及其用法
    0阅读 0条评论 个赞
    其实我们一直在使用SqlServer的连接池。在连接字符串中,Pooling为是否启用连接池,默认值为true,表示启用。与连接池相关的两个重要参数是MinPoolSize和MaxPoo……
  • SQL Server动态生成分区脚本
    0阅读 0条评论 个赞
    一、前言前段时间使用表分区比较多,虽然已经写了SQLServer合并(删除)分区解惑、SQLServer2005分区模板与实例,但是在实践中一直感觉修改SQL脚本的时间比较多,一直想抽个时间来把……
  • SQL Server表变量和临时表的区别
    0阅读 0条评论 个赞
    一、表变量表变量在SQLServer2000中首次被引入。表变量的具体定义包括列定义,列名,数据类型和约束。而在表变量中可以使用的约束包括主键约束,唯一约束,NULL约束和CHECK约束(外键……
  • 平均负载和CPU利用率有什么区别?
    2阅读 0条评论 个赞
    大家好,我是树哥。在性能优化中,我们经常会关注CPU平均负载这个指标。但如果让你来跟我解释一下什么是平均负载,你能说得清楚吗?它跟CPU使用率有什么区别?我想可能很多人都数不清楚,今天我们就来……
  • [设计模式] Java设计模式-桥模式
    0阅读 0条评论 个赞
    目录【设计模式】Java设计模式-桥接模式简介桥接模式实例代码示例①、品牌接口②、汽车品牌③、抽象汽车类④、汽车类型子类⑤、桥接模式测试1|1简介桥接(Bridge)是用于把抽象化与实现化解耦,使……
  • 用户自定义注释 AOP实现的日志保存(数据库) 所有代码都可以粘贴复制
    0阅读 0条评论 个赞
    前言1,在一些特定的场景我们往往需要看一下接口的入参,特别是跨系统的接口调用(下发,推送),这个时候的接口入参就很重要,我们保存入参入库,如果出问题就可以马上定位是上游还是下游的问题(方便扯皮)2,还……
  • SQL Server数据库性能优化
    0阅读 0条评论 个赞
    分析比较执行时间计划读取情况1.查看执行时间和cpusetstatisticstimeonselect*fromBus_DevHistoryDatasetstatisticstime……
  • 公司排班系统遇到瓶颈?我自己造一个!
    10阅读 0条评论 个赞
    本期名人堂我们有幸邀请到了白鲸开源的联合创始人代立冬先生。代立冬先生与我们分享了自己社区开源的经历,详细介绍了一个开源项目是如何加入Apache孵化器,如何在导师的辅导下慢慢孵化、成长的过程,以及自己……
  • Java可以重新锁定的那些东西(1)
    0阅读 0条评论 个赞
    本文主要包含的内容:可重入锁(ReedtrantLock)、公平锁、非公平锁、可重入性、同步队列、CAS等概念的理解显式锁……
  • 详细解释MySQL隔离级别
    0阅读 0条评论 个赞
    一个事务具有ACID特性,也就是(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),本文主要讲解一下其中的Isolation,也……
  • 深入了解春季交易:介绍 使用 原则
    8阅读 0条评论 个赞
    大家好,我是树哥。Spring事务是复杂一致性业务必备的知识点,掌握好Spring事务可以让我们写出更好地代码。这篇文章我们将介绍Spring事务的诞生背景,从而让我们可以更清晰地了解Sp……
  • 谈谈我是如何学习SQL Server的
    0阅读 0条评论 个赞
    谈谈我是如何学习SQLServer的相信很多人都想做大牛,但是你们知道这些大牛是怎样炼成的吗?我的一个同事做了差不多10年的.NET开发,算得上是大牛了吧?如果他遇到他熟悉的项目很快就能手到拿来,立……
  • 【高并发】从源码角度深入分析线程池如何优雅退出
    0阅读 0条评论 个赞
    大家好,我是冰河~~在【高并发专题】中,我们从源码角度深度分析了线程池中那些重要的接口和抽象类、深度解析了线程池是如何创建的,ThreadPoolExecutor类有哪些属性和内部类,以及它们对线程池……
  • 基于aiohttp的异步爬虫python实战
    0阅读 0条评论 个赞
    钢铁知识库,一个学习python爬虫、数据分析的知识库。人生苦短,快用python。之前我们使用requests库爬取某个站点的时候,每发出一个请求,程序必须等待网站返回响应才能接着运行,而在整个爬虫……
  • 国产超级大脑———rk 3568核心板!
    13阅读 0条评论 个赞
    从1956年麦卡锡首次提出“人工智能(AI)”的概念至今,人工智能已有66年的历史,而人工智能真正的崛起却是在最近的10年。随着消费电子行业的快速发展和激烈竞争,人工智能再度流行起来,尽管许多企业对A……
最近发布资讯
更多