[Database] 脏读、幻读这些都是什么?事务隔离级别又是什么?MySQL数据库的事务隔离级别都有哪些?

news2024/9/19 10:58:12

文章目录

  • 前言
  • 事务隔离级别
    • 三种数据不一致问题
      • 1. 脏读
      • 2. 不可重复读
      • 3. 幻读
      • 不可重复读 vs 幻读
    • 四种事务隔离级别
      • 1. READ UNCOMMITTED
      • 2. READ COMMITTED
      • 3. REPEATABLE READ
      • 4. SERIALIZABLE
    • 不同事务隔离级别会面临的问题
    • 不同隔离事务级别的使用率排名
  • 实战
    • 查看事务隔离级别
    • 更改事务隔离级别
  • 结语

前言


数据库作为一个服务(进程),不可避免会有被多个用户同时使用的场景。也就是所谓的并发场景,熟悉多线程编程的朋友们也应该都知道高并发下多线程修改共享数据需要做并发控制才能避免我们的共享数据出现错误。这里类比我们的关系型数据库其实也不例外,隔离等级就是关系型数据库提供给我们的并发控制工具。本文将带你了解MySQL提供给我们的事务隔离等级以及不同等级下会面对的不同数据错误问题。

事务隔离级别


事务隔离级别,英:Transaction Isolation Level,有时候会被省略为隔离级别。MySQL的官方文档对其解释如下:

15.7.2.1 Transaction Isolation Levels

大致的意思是:事务隔离是数据库处理的基础之一。隔离(Isolation)在数据库特性缩写的ACID中代表着 I隔离等级则是在多个事务同时进行时,用于平衡性能和事务结果的可靠性、一致性和再现性(reproducibility)的一种设定(Setting)

说白话就是,并发场景下,不同的隔离事务等级有着不同的性能和结果可靠性。严格的隔离等级就意味着性能的损失,但也意味着事务结果更加可靠,反之亦然

三种数据不一致问题

在了解具体不同事务隔离等级之前,我们需要先了解几种数据不一致问题的概念,我们的数据库,通常会面临几种数据不一致问题,分别是:

  1. 脏读
  2. 不可重复度
  3. 幻读

下面我们分别介绍一下这几个概念。

1. 脏读

脏读,英:dirty read。

脏读意味着读到了不可信的数据,比如数据被某个事务更改了,但是明明该事务还没提交,就已经可以被其他事务读到了,只有事务的隔离级别是read uncommitted时才会出现脏读

脏读 Dirty Read

2. 不可重复读

不可重复读,英:non-repeatable read。

不可重复读意味着,在同一个事务里,一个查询被前后两次执行去获取数据,根据数据库ACID的特性,我们认为 同一个事务相同的查询操作去获取数据应该是能得到相同的数据。然而我们一前一后的两个查询却取到了不同的数据(有的数据被其他事务修改并提交因此被读到)。

不可重复度 non-repeatable read

3. 幻读

幻读,英:phantom read。

phantom,有幻觉之意。幻读意味着在同一个事务里,我们执行同一个查询语句两次,一前一后。后一个查询读到了前一个查询里没有的数据(由于其他事务插入了新数据或是更新了数据导致where语句条件通过)。数据的突然出现,就像幻觉一样

幻读 Phantom Read

不可重复读 vs 幻读

如何区分不可重复读和幻读一直是一个问题,因为按照定义幻读其实也是一种不可重复读。毕竟在幻读的场景下同一事务内同一查询操作前后两次请求到的数据确实不一样,也符合不可重复读的前后不一致的定义。

所以如何区分这两个概念呢?笔者这里提供一个思路:

  • 不可重复读:侧重点是前后两次请求到的结果集内数据条数一致,但结果集内的数据并不完全一致的情况。
  • 幻读:侧重点是前后两次请求到的结果集内数据条数不一致

四种事务隔离级别

MySQL的数据存储引擎InnoDB根据SQL:1992 标准的规定,提供了四种事务隔离级别。

4种隔离级别
按隔离严格程度低到高排序 分别是:

  1. READ UNCOMMITTED
  2. READ COMMITTED
  3. REPEATABLE READ(默认隔离级别)
  4. SERIALIZABLE

笔者会在接下来的章节里分别介绍这几种隔离级别。

1. READ UNCOMMITTED

READ UNCOMMITTED,中译:读未提交。

是最不严格的事务隔离级别,速度也最快。如其名,其他事务的未提交(Commit)的修改,也能感知(Read)到。也正是因为如此,使用这种隔离级别会导致前面我们提到的所有三种问题。

2. READ COMMITTED

READ COMMITTED,中译:读提交。

比READ UNCOMMITTED稍微严格一点的事务隔离级别,性能次于READ UNCOMMITTED,和READ UNCOMMITTED相比,一个事务的未提交的修改,不能被其他的事务感知,但一旦提交后,其他能立即感知到这个变化。使用这种隔离级别会导致幻读和不可重复读。

3. REPEATABLE READ

REPEATABLE READ,中译:可重复读。是InnoDB引擎的默认事务隔离级别

比READ COMMITTED更严格一点的事务隔离级别,性能次于READ COMMITTED,和READ COMMITTED相比,其他事务提交的修改,不会影响到当前的事务的多次查询结果。但是对于新数据的插入则会出现幻读(数据条数增加)。

InnoDB为了实现这种隔离级别,用到了MVCC(Multi-Version Concurrency Control / 多版本并发控制)机制。这个机制本文不过多做讨论,有兴趣的读者可以自行搜索关键词MVCC。

4. SERIALIZABLE

SERIALIZABLE,中译:串行化、序列化。是InnoDB引擎最不常用的事务隔离级别。

作为最严格的事务隔离级别,因为额外的控制开销导致这种隔离级别的事务性能最差。但也正因为如此,这个隔离级别的事务不会遇到上述的三种问题中的任意一种。

不同事务隔离级别会面临的问题

不同事务隔离级别的事务会面临不同的问题,为了方便记忆和理解,笔者作了一个表格。

隔离级别脏读不可重复读幻读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

不同隔离事务级别的使用率排名

在MySQL官方文档里提供了隔离级别的使用率排名。
不同隔离事务级别的使用率排名
从最常用的到最不常用的顺序分别是:

  1. 默认的REPEATABLE READ
  2. READ COMMITTED
  3. READ UNCOMMITTED
  4. SERIALIZABLE

可以看到通常情况下我们不太需要设置默认的隔离事务级别,基本都是够用的。

实战

简单列举几个实战的例子。

查看事务隔离级别

你可以通过在MySQL的命令行客户端执行

show variables like '%tx_isolation%';

select @@tx_isolation;

就可以查询到事务的隔离级别了

查询事务隔离级别

亦或是在你的数据库连接工具里执行也是可以的,如下:

select @@global.tx_isolation;
select @@session.tx_isolation;
select @@tx_isolation;

数据库连接工具

更改事务隔离级别


虽然我们大部分情况使用默认的隔离事务级别即可,但是如果你想使用其他的事务隔离级别。你可以使用SET TRANSACTION命令去实现。

SET TRANSACTION命令

你可以通过下面几种命令去改变SESSION级别的事务隔离级别,全局的GLOBAL通常不推荐修改,没有权限的用户也是会被MySQL拒绝修改的。

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
select @@session.tx_isolation;

变更事务隔离级别

结语


事务之于数据库是非常重要的,而事务隔离级别之于事务也是一样,是非常重要的。理解几种事务隔离级别以及它们面临如脏读、幻读、不可重复读等问题,是更好地理解关系型数据库如何工作的基础。另外文中的大部分知识都在MySQL的官方文档能找到出处,笔者强烈推荐有英语阅读能力的读者们去阅读MySQL官方文档(文中有链接)。

我是虎猫,希望本文对你有所帮助。(=・ω・=)

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

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

相关文章

linux篇【11】:计算机网络—网络基础

目录 一.网络基础 1.认识 "协议" 2.协议分层 (1)软件分层 (2)协议分层 3.OSI七层模型 4.TCP/IP五层(或四层)模型 5.网络和操作系统之间的关系 6.数据包的封装(封包)和解包,分用 (1&…

四、文件管理(一)文件系统基础

目录 1.1文件的基本概念 1.2文件控制块和索引结点 1.3文件的操作 1.4文件保护 1.5文件的逻辑结构 1.5.1无结构文件(流式文件) 1.5.2有结构文件(记录式文件) 1.5.2.1顺序文件 1.5.2.2索引文件 1.5.2.3索引顺序文件 1.5…

数据库之架构

一、数据库架构原则 高可用 高性能 一致性 扩展性 二、常见的架构方案 方案一:主备架构,只有主库提供读写服务,备库冗余作故障转移用 jdbc:mysql://vip:3306/xxdb 1、高可用分析:高可用,主库挂了,kee…

[ vulhub漏洞复现篇 ] Apache Solr RemoteStreaming 文件读取与SSRF漏洞 (CVE-2021-27905)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

C++11特性-易用性改进

1.字符串的原始字面量 表达式:R"xxx(原始字符串)xxx"或者R"(原始字符串)",xxx要写的话,必须一样 //两种申明形式string a "aaa";//没有转义的时候就是原始字面量string b R"aaa(…

总体设计阶段复习

总体设计总体设计(概要设计/初步设计):确定系统模块及相互关系,划分程序,文件,数据库,文档等物理元素设计原理:启发规则图形工具:面向数据流设计方法(SD)总体设计(概要设计/初步设计):确定系统模块及相互关系,划分程序,文件,数据库,文档等物理元素 系统设计阶段 数据流图分析方…

一篇五分生信临床模型预测文章代码复现——Figure 4-6 临床模型构建(六)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

FineReport智能数据图表- 文本域控件

1. 概述 1.1 版本 报表服务器版本 11.0 1.2 应用场景 1.2.1 填报控件 填报报表中可以通过该控件输入多行文本信息,录入填报的数据,如下图所示: 1.2.2 参数控件 参数面板处可以通过该控件输入多行文本信息,键入查询参数&#…

【车载开发系列】UDS诊断---安全访问服务($0x27)

【车载开发系列】UDS诊断—安全访问服务($0x27) UDS诊断---安全访问服务($0x27【车载开发系列】UDS诊断---安全访问服务($0x27)一.概念定义二.安全控制过程三.报文格式1)请求种子2)发送密钥3)否定响应四.否定响应码列表五.参数定义六.注意事项…

JavaScript基础学习

文章目录什么是JavaScriptJavaScript 运行过程JvaScript 的组成JavaScript的三种书写模式行内式内嵌式外部式JavaScript的输出输出方式输入: prompt输出: alert输出: console.logJavaScript的一些基础语法变量的使用如何理解JS的动态类型(弱类型)基本数据…

SSM整合:mybatis层-P17

首先构建新的项目。 MYSQL: 在mysql中创建我们需要的表 CREATE DATABASE ssmbuild;USE ssmbuild;DROP TABLE IF EXISTS books;CREATE TABLE books ( bookID INT(10) NOT NULL AUTO_INCREMENT COMMENT 书id, bookName VARCHAR(100) NOT NULL COMMENT 书名, bookCo…

【深入浅出Spring原理及实战】「IOC容器初始化」彻底让你明白和理解运行原理和源码流程

前言介绍 本篇文章篇幅较大,希望读者可以慢慢阅读,建议收藏,分多次阅读学习。 学习源码的过程当中,有几点建议: 一定要学会抓重点,归纳核心类、核心方法、核心步骤; 分析源码我们不需要太过于纠…

MongoDB 存储引擎

简单回顾 上次我们说到了关于 mongodb 的集群,分为主从集群和分片集群,对于分片集群中的分片这里需要注意如下几点,一起来回顾一下: 对于热点数据某些分片键(分片键是集合中每个文档中存在的索引字段或复合索引字段&a…

qt历史数据管理模块(模块化程序)功能块复制直接使用不冲突

一、前言 qt对历史数据管理部分个人总结的模块化程序,直接按照步骤复制粘贴程序,直接实现历史数据管理功能,无需花费脑筋在理清各个思路,适合快速编写组装程序 二、环境 windows qt5.7 sqlite3 三、正文 建议参照前文&…

【uni-app】uni-app之云开发uniCloud跨全栈开发笔记总结,包括一个 schema自动生成代码小案例(附详细截图)

1- 前言 本文主要讲解如何使用uni-app 和 uniCloud 云开发,实现小案例,不需要后端,来实现全栈开发。 2- 概念 2.1 什么是uni-app uni-app 是一个使用Vue.js开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、…

对信息系统生命周期各阶段进行风险评估的要点汇总

概述 风险评估应贯穿于评估对象生命周期 各阶段中。评估对象生命周期各阶段中涉及的风险评估原则和方法昆一致的,但由干各阶段实施内容对象、安全需求不同.使得风险评估的对象、目的、要求等各方面也有所不同。在规划设计阶段,通过风险评估以确定评估对…

pytorch笔记(九)转置卷积、膨胀卷积

Transposed Convolution (转置卷积) 别名:Fractionally Strided Convolution (小数步长的卷积)、Deconvolution(逆/反卷积) 作用:upsampling(上采样) 模拟: PS:不是恢复原始值(因为一般情况下矩阵不可逆,无法等式左右两边同乘矩阵的逆得到原始矩阵) 转置卷积的…

为什么分布式系统这么火?

做Java的升职空间有限,可以说如果不想一辈子做程序员,只能往其他方向进行拓展,比如做到产品经理之类的或者技术总监。 可如果还是想做和技术相关的职业,那么架构师是很好的一步。 可是要如何做一名优秀的架构师呢? …

每天五分钟机器学习:经典的机器学习PCA的核心——特征分解技术

本节重点 本节我们将学习特征分解,特征分解是矩阵分析中非常重要的概念,它也可以应用到PCA算法中,本节先讲解什么是特征分解,然后讲解特征分解在PCA算法中的应用。 数学知识准备 如上所示是方差的定义,方差是度量一组数据的分散程度 如上所示是方差的定义,协方差是…

BSP板机支持包、linux启动分析、ARM裸机编程

文章目录一、BSP二、驱动驱动的基本要素三、启动分析1.uboot2.uboot的作用3.uboot相关命令关键的内容:1)bootargs,启动参数2)启动命令3)修改启动延时时间4)复位开发板5)修改本地IP地址6&#xf…