【图例】直观的感受MySQL事务的隔离级别分别解决了什么问题?以及如何查看和设置事务隔离级别!

news2024/11/23 1:16:32

目录

  • 前言
  • 一、读未提交(Read Uncommitted)
  • 二、读已提交(Read Committed)
  • 三、可重复读(Repeatable Read)
  • 四、串行化(Serializable)


前言

在MySQL中,事务的隔离级别决定了一个事务可能受其他并发事务影响的程度。可重复读作为默认的隔离级别,确保了在同一个事务中,多次读取同一行数据的结果都是一致的。

-- 查看当前会话的隔离级别:
-- 对于MySQL 8.0及以上版本,使用命令
SELECT @@transaction_isolation;-- 对于MySQL 5.0至7.9版本,使用命令
SELECT @@tx_isolation;-- 查看全局的隔离级别:
-- 对于MySQL 8.0及以上版本,使用命令
SELECT @@global.transaction_isolation;-- 对于MySQL 5.0至7.9版本,使用命令
SELECT @@global.tx_isolation;

要设置MySQL的隔离级别,可以使用以下命令:

-- 设置会话级别的隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 设置全局级别的隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

MySQL的隔离级别包括以下几种:

一、读未提交(Read Uncommitted)

这个级别下,事务可以读取其他事务未提交的数据。

事务一测试sql:

-- 设置隔离级别为读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 查看隔离级别
SELECT @@tx_isolation;

-- 启动事务一
START TRANSACTION;

SELECT name as 更改前姓名, age as 更改前年龄 FROM student WHERE id = 1;

UPDATE student SET age = age + 1 WHERE id = 1;

COMMIT;

事务二测试sql:

-- 设置隔离级别为读未提交
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

-- 查看隔离级别
SELECT @@tx_isolation;

-- 启动事务二
START TRANSACTION;

SELECT name as 姓名, age as 年龄 FROM student WHERE id = 1;

COMMIT;

在这里插入图片描述
可以看到事务二中可以读取事务一未提交的修改,读未提交的隔离级别可能会导致脏读、不可重复读和幻读。

二、读已提交(Read Committed)

事务一测试sql:

-- 设置隔离级别为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL Read Committed;

-- 查看隔离级别
SELECT @@tx_isolation;

-- 启动事务一
START TRANSACTION;

SELECT name as 更改前姓名, age as 更改前年龄 FROM student WHERE id = 1;

UPDATE student SET age = age + 1 WHERE id = 1;

COMMIT;

事务二测试sql:

-- 设置隔离级别为读已提交
SET SESSION TRANSACTION ISOLATION LEVEL Read Committed;

-- 查看隔离级别
SELECT @@tx_isolation;

-- 启动事务二
START TRANSACTION;

SELECT name as 姓名, age as 年龄 FROM student WHERE id = 1;

-- 模拟此处执行其他业务后再次查询,睡眠3s
DO SLEEP(3);

SELECT name as 姓名, age as 年龄 FROM student WHERE id = 1;

COMMIT;

在这个级别下,事务只能读取到已经提交的数据。
在这里插入图片描述

读已提交此隔离级别,可以解决了读未提交的脏读,但是在同一事务中会出现同一sql多个结果的情况,会出现不可重复读和幻读。

三、可重复读(Repeatable Read)

这是MySQL默认的隔离级别,可以防止脏读和不可重复读,但在某些情况下仍可能发生幻读

事务一sql:

-- 设置隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL Repeatable Read;

-- 查看隔离级别
SELECT @@tx_isolation;

-- 启动事务一
START TRANSACTION;

SELECT name as 更改前姓名, age as 更改前年龄 FROM student WHERE id = 1;

UPDATE student SET age = age + 1 WHERE id = 1;

COMMIT;

事务二sql:

-- 设置隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL Repeatable Read;

-- 查看隔离级别
SELECT @@tx_isolation;

-- 启动事务二
START TRANSACTION;

SELECT name as 姓名, age as 年龄 FROM student WHERE id = 1;

-- 模拟此处执行其他业务后再次查询,睡眠3s
DO SLEEP(3);

SELECT name as 姓名, age as 年龄 FROM student WHERE id = 1;

COMMIT;

在这里插入图片描述
但会导致幻读。如表数据为
在这里插入图片描述
幻读(很魔幻),就是事务 A 根据条件查询得到了 3 条数据,但此时事务 B 删除或者增加了 1 条,但可重复读的隔离级别导致了事务 A 再次进行查询的时候真实的数据集已经发生了变化,但是A却查询不出来这种变化,因此产生了幻读。

就会导致B事务增加了id为4的数据,但A事务读取数据时id只到3,插入id为4的记录就会报错。

四、串行化(Serializable)

这是最高的隔离级别。

事务一测试sql:

-- 设置隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL Serializable;

-- 启动事务一
START TRANSACTION;

INSERT INTO student (name, age) VALUES ('John', 20);
INSERT INTO student (name, age) VALUES ('John1', 21);

SELECT * FROM student WHERE id BETWEEN 1 and 100;

COMMIT;

事务二测试sql:

-- 设置隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL Serializable;

-- 启动事务二
START TRANSACTION;

SELECT * FROM student WHERE age BETWEEN 1 and 100;

-- 模拟此处执行其他业务后再次查询,睡眠3s
DO SLEEP(5);

SELECT * FROM student WHERE age BETWEEN 1 and 100;

COMMIT;

在这里插入图片描述
通过完全串行化执行事务来避免脏读、不可重复读和幻读,但这可能会显著降低系统的并发性能。

实际生产不会把隔离级别设置为可串行化,默认可重复读隔离级别在MySQL中可以提供一定程度的保护,以防止数据的不一致性,但它并不能完全防止幻读现象的发生。在设计数据库应用时,需要根据具体的业务需求和数据一致性要求来选择合适的隔离级别锁策略


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

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

相关文章

如何本地搭建Emby影音管理服务并结合内网穿透实现远程访问本地影音库

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

UE4 C++ 结构体

先在UCLASS()前写入: USTRUCT(BlueprintType) struct FMyStruct //必须以"F"开头 {GENERATED_BODY() //必须添加“GENERATED_BODY()”UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyStruct1")int32 Health;UPROPERTY(EditAnywher…

【算法】拦截导弹(线性DP)

题目 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 某天,雷达捕捉到敌国的导弹来袭。 由于该系…

04. 【Linux教程】安装 Linux 操作系统

通过前面的小节学习,我们已经对 Linux 操作系统有了简单的了解,同时也在 Windows 下安装了虚拟机软件 VMware ,那么本节课我们就介绍下如何使用虚拟机软件安装 Linux 操作系统。 通过第一小节的学习我们知道 Linux 有很多的发行版本&#xf…

Unity 访问者模式(实例详解)

文章目录 实例1:简单的形状与统计访客实例2:游戏对象组件访问者实例4:Unity场景对象遍历与清理访客实例5:角色行为树访问者 访问者模式(Visitor Pattern)在Unity中主要用于封装对一个对象结构中各个元素的操…

用Audio2Face导出Unity面部动画

开始之前说句话,新年前最后一篇文章了 一定别轻易保存任何内容,尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上,还要经历特殊Blender,自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

Qt QWidget Loading界面并覆盖在其他控件上面

目录 一、效果图二、Loading三、使用 一、效果图 界面中有一个Label&#xff0c;一个Button 点击Buttion&#xff0c;显示Loading的界面&#xff0c;并覆盖到Label和Button上面 二、Loading loadingwidget.h #ifndef LOADINGWIDGET_H #define LOADINGWIDGET_H#include <…

曲线拟合、多项式拟合、最小二乘法

最近在做自车轨迹预测的工作&#xff0c;遇到 曲线拟合、多项式拟合、最小二乘法这些概念有点不清晰&#xff0c; 做一些概念区别的总结&#xff1a; 曲线拟合用于查找一系列数据点的“最佳拟合”线或曲线。 大多数情况下&#xff0c;曲线拟合将产生一个函数&#xff0c;可用于…

1.26模拟退火

模拟退火是爬山算法的一种&#xff0c;是搜索算法 初始阶段 即只有在每次更新方案时&#xff0c;才会使循环次数增加

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端 Web开发技术…

屈子祠镇黑鱼岭,不可移动文物预防性保护系统守遗珍

一、何止秦俑 秦陵苑囿青铜水禽等文物集中展出 文物保护&#xff0c;尤其是不可移动文物的保护&#xff0c;一直都是文化遗产的重要环节。湖南省汨罗市屈子祠镇双楚村黑鱼岭墓地&#xff0c;作为长江中游地区的重大考古发现&#xff0c;其商朝晚期的历史背景赋予其不可估量的历…

鸿蒙开发实战-运动app开发

主要开发内容 3.1 开发准备 想要实现以下功能的话&#xff0c;需要学习“Tabs”&#xff0c;“TabContent”&#xff0c;“Row”&#xff0c;“Column”&#xff0c;等等相关技术。 主页 静坐页面   除此之外&#xff0c;还需要先准备8张图标的图片以及应用开发所需要的图片…

Python下载安装与环境配置

本文将指导您完成Python的下载、安装以及环境配置过程&#xff0c;确保您在编写和运行Python代码时能够获得最佳体验。我们将提供详细的步骤和代码示例&#xff0c;帮助您顺利完成设置。 一、Python下载与安装 访问Python官网&#xff1a;首先&#xff0c;您需要访问Python的官…

Django模型(六)

一、其它查询 文档:https://docs.djangoproject.com/zh-hans/4.1/ref/models/querysets/#count 1.1、排序 Queryset.order_by(*fields) 默认情况下,QuerySet 返回的结果是按照模型 Meta 中的 ordering 选项给出的排序元组排序的 可以通过使用 order_by 方法在每个 QueryS…

RocketMq5源码搭建

最近公司使用到了RocketMQ,所以打算研究一下RocketMQ 准备自己动手搭建一下RocketMq源码 前提 需要搭建jdk环境&#xff0c;jdk版本需要高于1.8 首先 从github 拉源码 源码地址&#xff1a;rocketMq源码传送门 启动namesrv 启动之前需要配置一下ROCKERMQ_HOME 配置如下&a…

【C++】 C++入门—内联函数

C入门 1 内联函数1.1 定义1.2 查看方式1.3 注意 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 内联函数 1.1 定义 程序在执行一个函数前需要做准备工作&#xff1a;要将实参、局部变量、返回地址以及若干寄存…

pnpm : 无法加载文件 D:\tool\nvm\nvm\node_global\pnpm.ps1,因为在此系统上禁止运行脚本

你们好&#xff0c;我是金金金。 场景 新创建的项目&#xff0c;在vscode编辑器终端输入 pnpm i&#xff0c;显示报错如上 解决 在终端输入get-ExecutionPolicy(查看执行策略/权限) 输出Restricted(受限的) 终端再次输入Set-ExecutionPolicy -Scope CurrentUser命令给用户赋予…

如何在淘宝和Shopee上进行选品:策略和原则

在当今数字化时代&#xff0c;电商平台已经成为卖家们扩展业务和增加销售额的重要渠道。而在淘宝和Shopee这两个知名电商平台上进行选品时&#xff0c;卖家可以遵循一些相似的原则和策略&#xff0c;以确保他们的产品能够吸引目标客户并取得成功。本文将为您介绍一些在淘宝和Sh…

uniapp H5 px转换rpx

uniapp H5 px转换rpx 安装 px2rpx 重启 HBuilderX在要转换的文件 点击右键 点击 开启px2rpx(1px转成2rpx) 开启成功&#xff01;使用 编辑页面后 按下键盘 Ctrl s 保存&#xff01;转化成功&#xff01;当然 你也需要对使用的插件 进行转换&#xff01;否则可能导致样式出现…

基于Python的Selenium详细教程_

一、PyCharm安装配置Selenium 本文使用环境&#xff1a;windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术&#xff1a;Python、HTML、CSS、JavaScript 1.Seleium安装&#xff1a; 在PyCharm终端或window命令窗口输入以下命令 #查看已安装的Pytho…