MySQL-事务隔离级别

1. MySQL事务的四种隔离级别

1.1 读未提交(READ UNCOMMITTED)

READ UNCOMMITED提供了事务之间最小限度的隔离,除了幻读和不可重复读取的操作外,处于这个隔离级别的事务可以读到其它事务还未提交的数据。

1.2  读已提交(READ COMMITTED)

处于READ COMMITTED隔离级别的事务可以读取到其它事务对数据的修改。也就是说,在处理事务期间,如果其他事务修改了相应的表(已提交),那么同一个事务的多次SELECT执行可能返回不同的结果。

1.3 可重复读(REPEATABLE READ)

可重复读隔离级别上,当前正在执行事务的变化不能被其它事务看到,也就是说,同一个事务的多次SELECT执行结果是相同的。

1.4 串行化(SERIALIZABLE)

串行化,事务之间一个接一个的执行,这种隔离级别提供了事务之间最大限度的隔离。

2. 通过例子理解脏读、不可重复读、幻读

2.1 读未提交隔离级别下脏读、不可重复读、幻读

2.1.1 准备测试数据

设置事务隔离级别为READ UNCOMMITTED

-- 在DBeaver打开2个SQL编辑窗口(不同的session),各执行如下语句。
-- 将两个SESSION的事务隔离级别设置为读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

创建一张用户表t_user,预插入两条数据,如表格:

2.1.2 脏读

脏读,在一个事务中可以读取到另一个事务还未提交的数据。

窗口A

--事务A
line1: START TRANSACTION;
line2: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line3: COMMIT;

窗口B

-- 事务B
line1: START TRANSACTION;
line2: SELECT * FROM t_user;
line3: COMMIT;

测试步骤:

a) 窗口A执行line1, line2, 插入用户“王五”,先不执行提交

b) 窗口B执行line1,line2时,可以看到用户“王五”,而此时窗口A尚未提交事务,产生了脏读

2.1.3 不可重复读

不可重复读,在一个事务中多次执行SELECT语句,返回的结果不相同。

A窗口

-- 事务A
line1: START TRANSACTION;
line2: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line3: INSERT INTO t_user(id, user_name, balance) VALUES (4, '赵六', 1000);
line4: COMMIT;

B窗口

-- 事务B
line1: START TRANSACTION;
line2: SELECT * FROM t_user;
line3: SELECT * FROM t_user;
line4: COMMIT;

执行步骤

a) A窗口执行line1, line2语句,B窗口执行line1, line2语句,此时B窗口可以读取到“王五”。

b) A窗口接着执行line3, B窗口执行line3,此时B窗口可以读取到“王五”和“赵六”

两次SELECT查询结果不一致,所以是不可重复读

2.1.4 幻读

幻读与不可重复读比较像。事务比做人的话,就是当前事务产生幻觉了。

窗口A

--事务A
line1: START TRANSACTION;
line2: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line3: COMMIT;

窗口B

-- 事务B
line1: START TRANSACTION;
line2: SELECT * FROM t_user;
line3: DELETE FROM t_user WHERE id = 3;
line4: COMMIT;

执行步骤

a) A窗口执行line1, line2,B窗口执行line1, line2 , 可以读取到“王五”

b) B窗口继续执行line3,发现执行删除操作一直在等待,无法完成删除。原因是因为id=3的记录在窗口A尚未提交,脏读导致可以被窗口B看到,所以是无法删除的。此时就产生了幻觉,明明有id=3的记录,却无法删除。

2.2 读已提交隔离级别下脏读、不可重复读、幻读

2.2.1 设置事务隔离级别为READ COMMITTED

-- 在DBeaver打开2个SQL编辑窗口(不同的session),各执行如下语句。
-- 将两个SESSION的事务隔离级别设置为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

2.2.2 脏读

窗口A

--事务A
line1: START TRANSACTION;
line2: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line3: COMMIT;

窗口B

-- 事务B
line1: START TRANSACTION;
line2: SELECT * FROM t_user;
line3: COMMIT;

执行步骤:

a) 窗口A执行line1, line2 ,窗口B执行line1, line2看不到用户“王五”

b) 窗口A执行line3, 窗口B再次执行line2,此时可以看到用户“王五”,所以不存在脏读问题

2.2.3 不可重复读

窗口A

--事务A
line1: START TRANSACTION;
line2: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line3: COMMIT;

窗口B

-- 事务B
line1: START TRANSACTION;
line2: SELECT * FROM t_user;
line3: COMMIT;

执行步骤:

a) 窗口B执行line1, line2,此时看不到用户“王五”

b) 窗口A执行line1, line2, line3

c) 窗口B再次执行line2,此时可以看到用户“王五”,两次SELECT的结果不一致,所以是不可重复读

2.2.4 幻读

窗口A

--事务A
line1: START TRANSACTION;
line2: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line3: COMMIT;

窗口B

-- 事务B
line1: START TRANSACTION;
line2: SELECT * FROM t_user;
line3: INSERT INTO t_user(id, user_name, balance) VALUES (3, '王五', 1000);
line4: COMMIT;

执行步骤:

a) 窗口B执行line1,line2,此时没有看到用户“王五”

b) 窗口A执行line1, line2, 插入用户“王五”

c) 窗口B执行line3时会一直等待窗口A的事务提交或回滚。在这里窗口B产生了幻觉,明明执行SELECT没有看到用户“王五”,但是插入不成功。

2.3 REPEATABLE READ

和READ COMMITTED相比,REPEATTED READ进一步解决了不可重复读问题,但是幻读则未能解决。REPEATABLE READ中关于幻读的测试与上一小节基本一致,不同的是在步骤b中执行到line3提交事务。由于REPEATABLE READ已经解决了不可重复读,因此步骤b即使提交了事务,SELECT也查不出已经提交的数据。继续插入会报错。

2.4 SERIALIZABLE

SERIALIZABLE提供了事务之间最大限度的隔离,在这种隔离级别中,事务一个接一个的顺序执行,不会发生脏读,不可重复读以及幻读,最安全。

如果设置当前事务隔离级别为SERIALIZABLE,那么此时开启其它事务时,就会阻塞,必须等当前事务结束了,其它事务才能开启成功,因此前面的脏读,不可重复读,幻读问题在这个隔离级别下不会发生。

3. 总结

3.1 隔离级别与脏读、不可重复读、幻读的关系如下

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

3.2 隔离级别与性能之间的关系

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

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

相关文章

哪个牌子的电容笔值得入手?!实测西圣、品胜、倍思三大热门品牌!

电容笔逐渐走入了大众视野,不仅数码博主人手一支,很多上班族和学生党也开始使用电容笔来进行无纸化办公和学习。然而,市场上的电容笔品牌众多,产品质量参差不齐,为了帮助大家挑选出真正优质的产品,我花费了…

传奇开服教程之新GOM引擎登录器配置教程

现在新GOM引擎的版本比以前多了一些,是时候和你们分享一期新GOM引擎登录器配置教程了,顺便来和你们分享下新GOM引擎和老GOM引擎的区别。 新GOM引擎与老GOM的区别 1、老GOM引擎1108的pak.txt就在登录器配置文件夹下,新GOM引擎的pak.txt在登录…

使用 ASP.NET Core 8.0 创建最小 API

构建最小 API,以创建具有最小依赖项的 HTTP API。 它们非常适合需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。 本教程介绍使用 ASP.NET Core 生成最小 API 的基础知识。 在 ASP.NET Core 中创建 API 的另一种方法是使用控制器。 有关在最小 …

哪些CRM系统适合医疗行业?主流10款产品全解析

本文介绍了10款crm系统:纷享销客、Zoho CRM、海创CRM、红云CRM、慧影CRM、易华录CRM、用友健康CRM、Highrise CRM、Maximizer CRM、Infusionsoft by Keap。 在医疗行业中,选择合适的客户关系管理(CRM)系统可能是一项令人头疼的挑战…

Redis 哨兵 总结

前言 相关系列 《Redis & 目录》(持续更新)《Redis & 哨兵 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 哨兵 & 总结》(学习总结/最新最准/持续更新)《Redis & 哨兵…

学习笔记:黑马程序员JavaWeb开发教程(2024.10.26)

P3 Day01-02 需要记住: P4 Web前端开发 P34 Ajax介绍 对于异步交互的举例:浏览器中输入不同的关键词,会有不同的提示,但是浏览器没有进行刷新 同步,会进行等待,在浏览器中访问链接,点击网页什么…

keepalived+web 实现双机热备

环境:利用keeplived实现web服务器的双机热备(高可用) 注意: (1) 利用keeplivedweb做双击热备(高可用),最少需要两台服务器,可以实现多域名对应一个VIP,并且访问不同域名,显示不同主页&#xf…

fetch: 取消请求、读取流、获取下载进度...

引言 Fetch API 提供了一个获取资源的接口(包括跨网络通信)。对于任何使用过 XMLHttpRequest 的开发者来说, 对于 Fetch 应该都能轻松上手, 而且新的 API 提供了更强大和灵活的功能集… 本文主要就是记录下, 在使用 Fetch 期间可能会碰到的几个小案例… 一、取消请求 在前端…

【动态规划】力扣509. 斐波那契数

目录 一、题目二、代码 一、题目 二、代码 class Solution {public int fib(int n) {if (n < 1) {return n;}int[] f new int[n 1];f[0] 0;f[1] 1;for (int i 2; i < n; i) {f[i] f[i - 1] f[i - 2];}return f[n];} }

从蚂蚁金服面试题窥探STW机制

背景 在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;垃圾回收&#xff08;GC&#xff09;是一个至关重要的机制&#xff0c;它负责自动管理内存的分配和释放。然而&#xff0c;垃圾回收过程并非没有代价&#xff0c;其中最为显著的一个影响就是STW&#xff08;Stop-T…

Flink CDC系列之:学习理解核心概念——Data Pipeline

Flink CDC系列之&#xff1a;学习理解核心概念——Data Pipeline 数据管道sourcesink管道配置Table IDroutetransform案例 数据管道 由于 Flink CDC 中的事件以管道方式从上游流向下游&#xff0c;因此整个 ETL 任务被称为数据管道。 管道对应于 Flink 中的一系列操作。 要描…

知识见闻 - 磁力片原理

磁力片是一种利用磁性原理设计的玩具&#xff0c;它的工作原理和磁性方向的排列方式非常有趣。让我们深入了解一下磁力片的核心原理和磁性方向的特点。 磁力片的基本原理 磁力片的工作原理基于磁铁的基本特性。每个磁力片都包含多个小磁铁&#xff0c;这些磁铁被精心排列&#…

初识Linux · 动静态库(incomplete)

目录 前言&#xff1a; 静态库 动态库 前言&#xff1a; 继上文&#xff0c;我们从磁盘的理解&#xff0c;到了文件系统框架的基本搭建&#xff0c;再到软硬链接部分&#xff0c;我们开始逐渐理解了为什么运行程序需要./a.out了&#xff0c;这个前面的.是什么我们也知道了。…

如何在 Linux 中对 USB 驱动器进行分区

如何在 Linux 中对 USB 驱动器进行分区 一、说明 为了在 Linux 上访问 USB 驱动器&#xff0c;它需要有一个或多个分区。由于 USB 驱动器通常相对较小&#xff0c;仅用于临时存储或轻松传输文件&#xff0c;因此绝大多数用户会选择只配置一个跨越整个 USB 磁盘的分区。但是&a…

️ Vulnhuntr:利用大型语言模型(LLM)进行零样本漏洞发现的工具

在网络安全领域&#xff0c;漏洞的发现和修复是保护系统安全的关键。今天&#xff0c;我要向大家介绍一款创新的工具——Vulnhuntr&#xff0c;这是一款利用大型语言模型&#xff08;LLM&#xff09;进行零样本漏洞发现的工具&#xff0c;能够自动分析代码&#xff0c;检测远程…

编写一个简单的Iinput_dev框架

往期内容 本专栏往期内容&#xff1a; input子系统的框架和重要数据结构详解-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客 I2C子系统专栏&#xff1a; 专栏地址&#xff1a;IIC子系统_憧憬…

2024年CentOS镜像下载地址,包括CentOS官网、国内镜像下载,超详细也

这里给大家提供了4种镜像下载地址&#xff0c;包括CentOS官方镜像下载、阿里云开源镜像站下载、网易开源镜像下载搜狐开源镜像下载。 1.CentOS官网镜像下载 因为服务器在国外所以打开CentOS官方网站的时候可能会比较慢。大家可以选择后面几种国内镜像下载方式。 1.1进入CentO…

《决策思维:人人必备的决策口袋书》

本书干货很多&#xff0c;十分值得一读。但受众不是一线员工与一线管理者&#xff0c;更多的倾向于管理者的管理者。一线员工读完的最大收获是可以理解老板的决策逻辑与思维方式&#xff0c;便于更好的去做执行。同时&#xff0c;还能帮助判断老板的决策是否正确&#xff0c;是…

esp32学习:语音识别教程esp-skainet库的使用

乐鑫推出了基于esp_sr算法的语音识别应用esp-skainet。官方介绍&#xff1a;ESP-Skainet 以最便捷的方式支持基于乐鑫的 ESP32系列 芯片的唤醒词识别和命令词识别应用程序的开发。使用 ESP-Skainet&#xff0c;您可以轻松构建唤醒词识别和命令词识别应用程序。 支持的主要功能…

C#通过异或(^)运算符制作二进制加密(C#实现加密)

快速了解异或运算符&#xff1a; 异或运算符在C#中用 “^” 来表示 口诀&#xff1a;相同取0&#xff0c;相异取1 简单加密解密winform示例&#xff1a; /// <summary>/// 异或运算符加密实现/// </summary>/// <param name"p_int_Num">初始值<…