【mysql事务隔离级别】事务隔离级别(面试高频考点!)

目录

什么是事务的隔离级别?

常见的四种事务隔离级别

读未提交

读已提交 

 为什么没有解决幻读问题,是怎么导致的?

可重复读

串行化


什么是事务的隔离级别?

        事务的隔离级别(Isolation Level)指的是在并发环境中,不同事务之间相互隔离的程度。事务隔离级别定义了一个事务在读取和修改数据时,对其他事务的可见性和影响范围。

通俗来讲就是:你在做一件事的时候,别人能够否看你做的事情!你做事情做到什么程度的时候,才能够确切的让别人所看到!

常见的四种事务隔离级别

读未提交

        读未提交(Read Uncommitted)是最低的事务隔离级别(可以说是最不严谨的),在这个级别下,一个事务可以读取到其他事务尚未提交的数据。

        具体来说,当一个事务在读未提交隔离级别下运行时,它可以读取到其他事务已经修改但尚未提交的数据。这意味着一个事务可以看到其他事务的中间结果,即脏数据。这种隔离级别提供了最低的并发控制,没有任何锁定机制或多版本并发控制(MVCC)。

        通俗来讲:将读未提交类比到显示就是——“能看见别人所写的草稿”

读未提交隔离级别存在以下问题和风险:

  1. 脏读(Dirty Read):一个事务读取到了另一个事务尚未提交的数据,如果另一个事务在后续操作中回滚,则当前事务读取到的数据实际上是无效的。

  2. 不可重复读(Non-repeatable Read):在同一事务内,多次读取相同的数据可能会得到不一致的结果,因为其他事务可能在同时修改该数据。

  3. 幻读(Phantom Read):在同一事务内,多次执行相同的查询可能返回不同的结果集,这是因为其他事务可能在同时插入、删除或修改符合查询条件的数据。

读已提交 

        读已提交(Read Committed)是一种标准的事务隔离级别,在这个级别下,一个事务只能读取到已经提交的数据。这意味着对于未提交的数据修改,其他事务是不可见的

        具体来说,当一个事务在读已提交隔离级别下运行时,它只能看到已经被其他事务提交的数据。其他事务对数据的修改在提交之前对当前事务是不可见的,从而避免了脏读(Dirty Read)的问题。

        通俗来讲:类比到现实生活中就是—— "只读取已经发布的信息"。

        读已提交隔离级别提供了较好的并发控制机制,它使用锁定和多版本并发控制(MVCC)等技术来确保事务之间的隔离性和一致性。

读已提交隔离级别的特点包括:

  1. 无脏读:事务只能读取到其他事务已经提交的数据,不会读取到未提交的数据。

  2. 避免脏写:其他事务对于当前事务已经提交的数据是只读的,不能进行修改,从而避免了数据的脏写(Dirty Write)问题。

没有解决幻读的问题,也可能出现不可重复读的问题

 为什么没有解决幻读问题,是怎么导致的?

        对于读已提交(Read Committed)隔离级别来说,虽然可以解决脏读的问题,但并不能完全解决幻读(Phantom Read)的问题。

        幻读是指在同一事务内,多次执行相同的查询可能返回不同的结果集,这是因为其他事务在同时插入、删除或修改符合查询条件的数据。读已提交隔离级别无法阻止其他事务在查询过程中插入新的数据,从而导致出现幻读问题。

简单的例子来说明幻读问题:

假设有两个并发的事务:事务A和事务B。

事务A执行如下语句:
SELECT COUNT(*) FROM orders WHERE status = 'unpaid';

此时事务B同时执行如下语句:
INSERT INTO orders (order_id, status) VALUES (12345, 'unpaid');
COMMIT;

然后事务A再次执行相同的查询语句:
SELECT COUNT(*) FROM orders WHERE status = 'unpaid';

        在读已提交隔离级别下,事务A第一次查询得到的结果可能是3,因为此时还没有插入新的订单。但在第二次查询时,事务B已经插入了一个新的未付款订单,所以结果可能变成4。这就是典型的幻读问题:同一事务内,相同的查询语句得到了不同的结果集。

可重复读

        可重复读(Repeatable Read)是一种事务隔离级别,相对于读已提交隔离级别来说,在并发环境下提供了更高的数据一致性和稳定性。在可重复读隔离级别下,事务在执行过程中看到的数据保持一致,即使其他事务对数据进行了修改或插入操作。

        通俗来讲:类比于现实生活中就是—— "在读取过程中,即使数据发生了变化,我的结果也不会变"。

可重复读隔离级别的主要特点包括:

  1. 读取锁(Read Locks):事务在读取数据时会对所读取的数据加上读取锁,其他事务可以读取同样的数据,但不能对该数据进行修改。

  2. 写入锁(Write Locks):事务在对数据进行修改时会对所修改的数据加上写入锁,其他事务无法读取或修改该数据,直到持有写入锁的事务释放锁。

  3. 一致性快照(Consistent Snapshot):在事务开始执行时,会创建一个一致性快照,该快照用于保持读取的数据的一致性。事务在整个执行过程中都会使用这个一致性快照,即使其他事务对数据进行了修改也不会影响当前事务的结果。

        具体来说,可重复读隔离级别通过使用锁定和多版本并发控制(MVCC)等技术来实现数据一致性和防止脏读、不可重复读以及幻读的问题。

缺点——可重复读隔离级别相对于其他隔离级别来说,更严格地使用锁机制来保证数据的一致性和隔离性。这种锁的使用可能会导致更多的锁竞争情况。

串行化

        串行化隔离级别是最严格的隔离级别,它确保事务之间完全串行执行,避免了并发带来的任何问题。在串行化隔离级别下,每个事务都会获得独占锁,并且其他事务无法同时读取或修改被锁定的数据,从而保证了数据的一致性和隔离性。

        当一个事务开始执行时,它会对要读取或修改的数据加上共享锁或独占锁。其他事务如果需要访问相同的数据,就必须等待当前事务释放锁。这样可以避免幻读、不可重复读和脏读等问题的发生,因为每个事务都是在其他事务完全执行完毕后再开始执行,序列化地执行。

        通俗来说,类比到现实生活中就是 "排队等候一个接一个完成任务"。

与可重复读隔离级别相比,串行化隔离级别的区别主要在于锁的使用方式和范围:

  1. 锁级别:可重复读隔离级别下使用的是行级锁,即对单个数据行进行锁定。而串行化隔离级别则使用表级锁,对整张表进行锁定。这意味着在串行化隔离级别下,一个事务对某个表进行读取或修改时,其他事务无法同时读取或修改该表的任何数据。

  2. 锁冲突:在可重复读隔离级别下,多个事务可以同时对不同的数据行进行读取或写入,只有在涉及相同数据行时才存在锁冲突。而在串行化隔离级别下,任何两个事务之间都会存在锁冲突,因为它们无法同时读取或修改同一张表。

  3. 并发性能:由于串行化隔离级别严格限制了事务的并发执行,因此在高并发环境下可能会导致性能下降。相比之下,可重复读隔离级别允许事务并发执行,只需在读取和写入时使用适当的锁机制,因此并发性能更高。

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

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

相关文章

下一代存储解决方案:湖仓一体

文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构,它可以同时满足大数据存储和传统数据仓库的需求。具体来说,湖仓一体可以实现以下几个方面的功能: 数据集成: 湖仓一体可以集成多个数据源,包括结构…

Spring Cache框架(缓存)

1、介绍: Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单加个注解,就能实现缓存功能。它提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager 接口来实现不同的缓存技术。 针对不同…

Pygame编程(4)event模块

Pygame编程(4)event模块 函数示例 函数 pygame.event.pump 让 Pygame 内部自动处理事件pygame.event.get 从队列中获取事件pygame.event.poll 从队列中获取一个事件pygame.event.wait 等待并从队列中获取一个事件pygame.event.peek 检测某类型事件是否在…

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长,私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌,以其安全高效的私有化部署即时通讯解决方案,帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…

JavaWeb学习-Day10

SpringBootWeb案例 准备工作 开发流程: 开发接口步骤: 删除部门: 新增部门: 简化代码: limit:分页展示,公式:(页数-1)*页面总数,页面总数 目前出现的问题&am…

STM32 CubeMX (H750)RGB屏幕 LTDC

STM32 CubeMX STM32 RGB888 LTDC STM32 CubeMX一、STM32 CubeMX 设置时钟树LTDC使能设置屏幕参数修改RGB888的GPIO 二、代码部分效果 RGB屏幕线束定义: 一、STM32 CubeMX 设置 时钟树 这里设置的时钟,关于刷新速度 举例子:LCD_CLK24MHz 时…

穿越网络迷雾的神奇通道 - WebSocket详解

WebSocket,作为一项前端技术,已经成为现代Web应用不可或缺的一部分。本文将深入解析WebSocket,介绍其工作原理和用途,并通过简单的代码示例,让你对这个神奇的网络通信协议有更深入的了解。 WebSocket是什么&#xff1…

【大数据知识】大数据平台和数据中台的定义、区别以及联系

数据行业有太多数据名词,例如大数据、大数据平台、数据中台、数据仓库等等。但大家很容易混淆,也很容易产生疑问,今天我们就来简单聊聊大数据平台和数据中台的定义、区别以及联系。 大数据平台和数据中台的定义 大数据平台:一个…

Mysql索引+事务+存储引擎

索引 索引的概念 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找…

浅谈 Linux 下 vim 的使用

Vim 是从 vi 发展出来的一个文本编辑器,其代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 Vi 是老式的字处理器,功能虽然已经很齐全了,但还有可以进步的地方。Vim 可以说是程序开发者的一项很好用的工…

代码随想录Day_48打卡

①、打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房…

STM32之17.PWM脉冲宽度调制

一LED0脉冲宽度调制在TIM14_CHI&#xff0c;先将LED&#xff08;PF9&#xff09;代码配置为AF推挽输出模式&#xff0c;将PF9引脚连接到TIM14&#xff0c; #include <stm32f4xx.h>static GPIO_InitTypeDef GPIO_InitStruct;void Led_init(void) {//打开端口F的硬件时钟&a…

Yolo系列-yolov2

YOLO-V2 更快&#xff01;更强&#xff01; YOLO-V2-BatchNormalization BatchNormalization&#xff08;批归一化&#xff09;是一个常用的深度神经网络优化技术&#xff0c;它可以将输入数据进行归一化处理&#xff0c;使得神经网络更容易进行学习。在YOLOv2中&#xff0c;B…

《C和指针》笔记11: external和internal链接属性

当组成一个程序的各个源文件分别被编译之后&#xff0c;所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起&#xff0c;形成可执行程序。然而&#xff0c;如果相同的标识符出现在几个不同的源文件中时&#xff0c;它们是像Pascal那样表示同一个实体&#xff1f;…

HashSet 和 TreeSet 的区别

HashSet 和 TreeSet 都是 Java 中的集合类&#xff0c;用于存储一组不重复的元素。它们的主要区别在于内部实现和性能方面。 内部实现&#xff1a; HashSet 使用哈希表实现&#xff0c;通过散列函数将元素存储在数组中&#xff0c;这样可以快速地查找元素。TreeSet 使用红黑树实…

Apache StreamPark系列教程第二篇——项目打包和开发

一、项目打包 项目依赖maven、jdk8.0、前端(node、npm) //下载代码 git clone//maven打包相关内容 mvn -N io.takari:maven:wrapper //前端打包相关内容 curl -sL https://rpm.nodesource.com/setup_16.x | bash - yum -y install nodejs npm -v npm install -g pnpm默认是h2…

手把手教你搭建Serv-U FTP服务器共享文件并实现外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&#xff0c;智能…

Unity字符串性能问题

前言 分享一些通过书籍和网络学到的知识 每次动态创建一个string&#xff0c;C#都会在堆内存分配一个内存用来分配字符串&#xff0c;因为C#没有对字符串的缓存机制&#xff0c;会导致每次连接、切割、组合的时候都会申请新的内存&#xff0c;并且抛弃原来的内存&#xff0c;等…

大数据处理 正则表达式去除特殊字符 提取中文英文数字

在文本处理中&#xff0c;经常会碰到含有特殊字符的字符串。 比如用户昵称&#xff0c; 小红书文案&#xff0c;等等 都包含了大量表情特殊字符。 这些特殊字符串在ETL处理过程中&#xff0c;经常会引起程序报错&#xff0c;导致致命错误&#xff0c;程序崩溃&#xff1b;或者导…

TensorBoard的使用

TensorBoard&#xff1a;对图像进行变换 1. SummaryWriter的使用 ctrl类出现注释解析&#xff1a; 将条目直接log_dir写入要成为由TensorBoard使用。 “摘要编写器”类提供了一个高级 API 来创建事件文件&#xff0c;并在给定目录中添加摘要和事件。该类更新文件内容异步。…