mysql默认的事务隔离级别能达到什么效果_数据库四大特性

mysql默认的事务隔离级别能达到什么效果_数据库四大特性网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。 前言 ​ 此篇文章作为自己学习 的一些个人理解,使用的引擎是 。首先先讲讲 事务 的概念,在 中其对 事务 的描述是这样的

粗谈MySQL事务的特性和隔离级别

网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。

前言

​  此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能MySQL》第三版中其对事务的描述是这样的:

事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么就执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。

​​  换句话说,事务就是一个整体单位,里面的SQL语句不会单独执行,就像某些商品一般,由多个组件组成,但是我绝对不单独卖组件,要买就买整个商品,不然就不卖。

​​  简单的理解了事务之后,还需要知道事务的目的就是为了保证数据的正确性和一致性,那么为此则诞生出其4个特性(后面再细讲),而为了实现这四个特性又需要许多具体的实现,其中就包括为了隔离性而产生的四个隔离级别,这四种隔离级别又产生了三个问题脏读不可重复读幻读),这就是其大致的关系,接下来让我们来看看这些具体到底是个什么东西。

1 四种特性(ACID)

​​  说起事务的特性,那肯定张口就来ACID,然而除了ACID四个字母之外我们还是需要说点其他东西的。

​​  原子性(Atomicity):意思是说一个事务应当作为一个不可分割的最小单位,整个事务的操作要么全部执行成功要么全部不执行,像原子一样不可分割(别跟我提夸克),这里的执行是指执行成功,如果有一个操作执行失败了那么就全部不执行,这也是我们平时见到的回滚。

​​  一致性(Consistency):书上给出的意思是事务总是从一个一致性的状态跳到另一个一致性的状态。我的理解是在涉及到的数据范围内是守恒的,也就是说,整体的数据是不变的,拿万能的转钱例子来说,A账户转给B``200元,那么由AB组成的这个数据范围来说数据并没有发生改变(-200+200=0)只是数据的组成方式变化了,所以是从一个一致性状态—>另一个一致性状态。

​​  隔离性(Isolation)通常来说,一个事务的操作对于其他的事务的不可见的,也就是说一般而言事务都是独立的。但是这跟数据库的隔离级别有关,除了某个(没错,就是你——读未提交同学)隔离级别之外,其他的都是不可见的,而这种事务可见的级别很少用到,所以说的是”通常来说”。

​​  持久性(Durability)事务一旦完成,那么该事务引起的数据变化将永久生效,不会改变(除非被另外一个事务改动)。不过书上提到这其实跟实行的策略相关,但这貌似就有点走远了(是的,我不懂!)。

​​  以上就是事务的四种特性,然而其中隔离性的实现则是要看数据库的隔离级别。

2 数据库的隔离级别

​​  在MySQL中隔离级别有四种,每种隔离级别对应的事务体现不同,可能出现的问题也各自不同。

​​  未提交读(read uncommited):在这个隔离级别中,在一个事务执行的操作就算不提交也能被其他的事务看到。在这个级别中一个事务可能读到其他事务还没提交的脏数据,即可能出现脏读。如下图所示,序号表示执行的顺序。

img

​​  可以看到,在界面1的事务中往test表插入了一条数据,此时就算还没提交在页面2的另一个事务中也可以看到提交的数据。

​​  提交读(read commited)在一个事务提交之后,其他事务才可以看到事务的修改。此隔离级别可能会出现同一个事务中执行相同的查询却读到不同的数据,即不可重复读nonrepeatable read),另未提交读也可能出现不可重复读。例子如下

img

​​  可重复读(repeatable read)这是MySQL的默认隔离级别在事务开始的时候会保存此刻的一个快照(这里啰嗦一下,实际上是开启事务后执行第一条语句的时候准备的快照,准备快照的方法则是记录当前事务的版本号,没有进行数据的复制,不明白事务版本号或隐藏字段的可以看看MySQLMVCC),然后接下来这个事务的所有数据读取都是从这个快照读,所以不会出现不可重复读的情况,但是还是有可能出现幻读。意思就是读取的是快照表数据不会变化,但是进行写操作如更新的时候更新的数量可能会跟预期的不同。如图

img

​​  可以看到,在界面1插入一条记录并且提交之后,界面2还是没有读到这个提交的数据,因为他是从事务开始时的快照表读取的所以自然是读不到的,但是在进行更新操作的时候则是更新了意料之外的记录,这就是一种幻读的现象。

​​  可串行化(serializable):意思就是事务要一个一个来,如果在一个事务中进行读操作,那么其他事务在该事务完成前只能进行读操作;如果进行写操作,那么其他事务的操作都进入等待(直到当前事务提交)。这种级别就可以防范目前出现的脏读、不可重复读、幻读等现象。如图

img

上图演示的是事务读时,其他事务不可写,下图是写时不可操作。

img

3 三个问题—脏读、不可重复读、幻读。

​​  这是采取事务的不同隔离级别可能产生的几个问题,在上面隔离级别已经提及到了,但是为了避免混淆还是单独拿出来。

  • 脏读:指在一个事务中读到了其他事务还没提交的脏数据,发生在读未提交级别。
  • 不可重复读:在一个事务中同样的查询可能出现不同的结果,发生在读未提交、读提交级别。(个人觉得没必要特意去理解为叫什么叫不可重复,容易混淆)
  • 幻读:在一个事务中进行写操作的时候修改的数量跟预期的数量不同,例如修改到了之前查询不出来的数据。

​​  再啰嗦一些不可重复读幻读的区别:可以理解为不可重复读是那条记录的字段值改变了,例如id1的记录中name的两次值都不同;而幻读则是数量上的不同,例如我查询的时候共有2条记录,但是执行修改操作的时候却更新了3条。






参考:《高性能MySQL》,http://www.zsythink.net/archives/1233/

或许我只是简单的想被认可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10058.html

(0)
上一篇 2023-01-26
下一篇 2023-01-26

相关推荐

  • 如何用Python获取数组长度

    如何用Python获取数组长度在开发中,数组是十分常用的一种数据结构。而在对数组进行操作时,获取数组长度是非常基本的操作之一。本文将介绍如何用Python获取数组长度,以及其他有关数组长度的操作。

    2024-07-01
    40
  • 最全Redis基础知识「建议收藏」

    最全Redis基础知识「建议收藏」NoSQL概述 什么是NoSQL NoSQL不仅仅是SQL,它是Not Only SQL 的缩写,也是众多非关系型数据库的统称NoSQL和关系型数据库一样,也是用来存储数据的仓库。 为什么需要NoSQ

    2023-02-06
    156
  • flink工作原理_逻辑概念

    flink工作原理_逻辑概念逻辑计划 1. logicGraph或者jobGraph,其端点为operator,edge为数据流向。 2. operator往往代表一个函数。 3. 同一个分区内的具有连续上下游关系的函数组成op

    2023-01-29
    138
  • redis伪分布主从环境配置[亲测有效]

    redis伪分布主从环境配置[亲测有效]监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息 下图中3个Sentinel监控着S1和它的2个Slave 配置: …

    2023-03-24
    140
  • sqoop的安装_sqoop导入数据到hdfs

    sqoop的安装_sqoop导入数据到hdfs本文介绍了如何安装sqoop,以及如何使用sqoop导入数据到hadoop、hive中去

    2022-12-26
    139
  • hw华为p40_华为旗舰手机

    hw华为p40_华为旗舰手机华为P40系列搭载HMS的应用好用吗?想买P40手机,但是不太懂手机这方面,有没有用过P40系列搭载HMS应用的?体验怎么样?有没有什么比较亮点的功能?另外华为应用市场安全不,我之前用的手机在市场下…

    2023-03-06
    138
  • Python实现SOCKS5代理服务器

    Python实现SOCKS5代理服务器在今天的互联网世界中,网络安全问题比以往任何时候都更受人们关注。在此背景下,代理服务器成为网民保护隐私和信息安全的重要工具之一。代理服务器即在客户端和目标服务器之间充当中间人的角色,使得客户端能够间接地访问目标服务器,从而实现隐藏真实IP地址,以及加密等功能的实现。在这种情况下,我们需要一个高效的、安全的、可靠的代理服务器来满足用户的需求。Python是一种高效的编程语言,在网络通信领域也有很好的应用。在这篇文章中,我们将学习如何使用Python来实现一个SOCKS5代理服务器。

    2024-08-25
    16
  • 使用Python储存数据值的示例

    使用Python储存数据值的示例Python作为一门高级编程语言,提供了很多处理数据的便捷方法。在Python中,可以使用各种数据类型来储存数据。最常见的数据类型包括整数、浮点数、字符串和布尔值。对于复杂的数据类型,比如列表、元组、集合和字典等,Python也提供了丰富的内置方法来操作。

    2024-03-01
    138

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注