数据库之事务隔离级别详解

事务隔离级别详解

  • 一、事务的四大特性(ACID)
    • 1. 原子性(atomicity):
    • 2. 一致性(consistency):
    • 3. 隔离性(isolation):
    • 4. 持久性(durability):
  • 二、事务的四种隔离级别
    • 1. 读未提交(Read uncommitted):
      • 1.1 简述
      • 1.2 事例
      • 1.3 分析
    • 2. 读已提交(Read committed):
      • 2.1 简述
      • 2.2 事例
      • 2.3 分析
    • 3. 可重复读(Repeatable read)
      • 3.1 简述
      • 3.2 事例
      • 3.3 分析
      • 3.4 什么时候会出现幻读?
        • 3.4.1 简述
        • 3.4.2 事例
        • 3.4.3 那怎么解决幻读问题?
    • 4. 串行化(Serializable)
    • 5. 小结
  • 三、MySql默认隔离级别
      • 1.版本说明
      • 2. 查询mysql全局事务隔离级别
        • 2.1 查询命令
        • 2.2 默认隔离级别如下
      • 3. 注意事项
  • 四、不同隔离级别演示
    • 演示准备
      • 创建sql语句准备
      • 数据准备
    • 读未提交----->脏读
      • 设置当前会话隔离级别为读未提交
        • 1、a 事务(客户端1) 修改 、未提交
        • 2、b事务(客户端2) 读该数据
        • 3、a事务(客户端1) 回滚
        • 4、b事务(客户端2) 再读该数据 和 2步不一致,脏读
    • 读已提交----->不可重复读
      • 设置当前会话隔离级别为读已提交
        • 1、a事务(客户端1) 修改 、未提交
        • 2、b事务(客户端2) 读该数据
        • 3、a事务(客户端1) 提交
        • 4、b事务(客户端2) 读该数据 , 不可重复读
    • 可重复读----->幻读
      • 设置当前会话隔离级别为可重复读
        • 1、a 事务(客户端1) 修改、未提交
        • 2、b 事务(客户端2) 读该数据
        • 3、a 事务(客户端1) 提交
        • 4、b 事务(客户端2) 读该数据 和之前一样可重复读
    • 串行化
      • 设置当前会话隔离级别为串行化
        • 1、a 事务(客户端1) 读取id = 1的数据
        • 2、b 事务(客户端2) 修改id = 1的数据,直接阻塞住
        • 3、a 事务(客户端1) 提交
        • 4、b 事务(客户端2) 获取行锁更新成功、串行执行
  • 五、MVCC(Multi-Version Concurrency Control)
    • MVCC原理底层就是通过read view 以及undo log来实现
    • 为什么会有MVCC
    • MVCC在哪个隔离级别下才生效
    • InnoDB行数据默认隐藏列
    • ReadView是什么
      • read view 参数解释
        • 1.creator_trx_id: 当前事务id
        • 2.m_ids:所有活跃事务的事务id
        • 3.min_trx_id: m_ids里最小的事务id值
        • 4.max_trx_id: 最大事务id
    • Read View快照的生成时机
      • repeatable read级别
      • read committed级别
      • 版本链比对规则
    • 一句话概括MVCC
    • MVCC比对练习题
      • 在同一个事务里,针对id=1的记录,当前事务ID分别为200,99,38,15,5的行记录能查询到么,是可见的么?
      • 思考题:为啥要把最小的事务id值单独作为一个字段?
  • 六、Mysql解决了幻读么,当前读呢

一、事务的四大特性(ACID)

1. 原子性(atomicity):

事务是一个原子操作,要么全部执行成功,要么全部执行失败。 事务的原子性确保一组逻辑操作,要么全部完成,要么完全不起作用。

2. 一致性(consistency):

执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的。

3. 隔离性(isolation):

事务的隔离性是指在并发执行的多个事务中,每个事务的执行互不影响,每个事务都有自己独立的空间进行操作。事务隔离级别越高,数据冲突的可能性就越小,但并发性能也会受到一定的影响。

4. 持久性(durability):

一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障,应用重启,也不应该对其有任何影响。

二、事务的四种隔离级别

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。在事务的并发操作中可能会出现脏读,不可重复读,幻读。

1. 读未提交(Read uncommitted):

1.1 简述

一个事务读到了另一个事务还没有提交的数据。

1.2 事例

父亲要给儿子转账。但是转账时父亲不小心按错了数字,按成10万/月,该钱已经打到儿子的账户,但是事务还没有提交,就在这时,儿子去查看自己的储蓄卡,发现转多了9万,以为凭空多了9万非常高兴。但是父亲及时发现了不对,马上回滚差点就提交了的事务,将数字改成1万再提交。

1.3 分析

实际父亲给儿子转的还是1万,但是儿子看到的是10万。儿子看到的是父亲还没提交事务时的数据。这就是脏读。

2. 读已提交(Read committed):

2.1 简述

一个事务要等另一个事务提交后才能读取数据。

2.2 事例

儿子拿着父亲的信用卡去消费(卡里目前有10),当他买单时(父亲事务开启),收费系统事先检测到他的卡里有10万,就在这个时候!!父亲要把钱全部转出充当家用,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待父亲转出金额事务提交完)。儿子就会很郁闷,明明卡里是有钱的…

2.3 分析

这就是读已提交,若有事务对数据进行更新操作时,读操作事务要等待这个更新操作事务提交后才能读取数据,可以解决脏读问题。但在这个事例中,出现了一个事务范围内两次相同的查询却返回了不同数据,这就是不可重复读。

3. 可重复读(Repeatable read)

3.1 简述

同一事务下,事务在执行期间,多次读取同一数据时,能够保证读取到的数据是一致的。

3.2 事例

儿子拿着信用卡去享受生活(卡里只有10万),当他买单时(事务开启,不允许其他事务的UPDATE修改操作),收费系统事先检测到他的卡里有10万。这个时候父亲不能转出金额了。接下来收费系统就可以扣款了。

3.3 分析

可重复读解决了不可重复读的问题。说到这里,应该明白的一点就是,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

3.4 什么时候会出现幻读?

3.4.1 简述

一个事务读取到了另一个事务新增的数据

3.4.2 事例

儿子某一天去消费,花了8千元,然后他的父亲去查看他今天的消费记录(全表扫描,儿子事务开启),看到确实是花了8千元,就在这个时候,儿子花了1万买了一部电脑,即新增INSERT了一条消费记录,并提交。当父亲打印儿子的消费记录清单时(儿子事务提交),发现花了1.8万元,似乎出现了幻觉,这就是幻读。

3.4.3 那怎么解决幻读问题?

串行化

4. 串行化(Serializable)

它是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率最低,比较耗费数据库性能,一般不推荐使用。

5. 小结

隔离级别脏读不可重复读幻读
读未提交可能出现可能出现可能出现
读已提交不会出现可能出现可能出现
可重复读不会出现不会出现可能出现
串行化不会出现不会出现不会出现

三、MySql默认隔离级别

1.版本说明

这里是8.0.33

mysql版本说明

2. 查询mysql全局事务隔离级别

2.1 查询命令

select @@global.transaction_isolation;

2.2 默认隔离级别如下

默认隔离级别

3. 注意事项

低版本的查询语句是select @@global.tx_isolation;

四、不同隔离级别演示

演示准备

创建sql语句准备

CREATE TABLE user (
	--自增ID
    id INT NOT NULL AUTO_INCREMENT,
    --姓名
    name VARCHAR(50) NOT NULL,
    --年龄
    age INT NOT NULL,
    --主键
    PRIMARY KEY (id)
);

数据准备

--插入一条记录,id为1,name为'张三',age为20
INSERT INTO user(id, name, age) VALUES (1, '张三', 20);
-- 插入一条记录,id为2,name为'李四',age为30
INSERT INTO user(id, name, age) VALUES (2, '李四', 30);
-- 插入一条记录,id为3,name为'王五',age为25
INSERT INTO user(id, name, age) VALUES (3, '王五', 25);
-- 插入一条记录,id为4,name为'赵六',age为28
INSERT INTO user(id, name, age) VALUES (4, '赵六', 28);

读未提交----->脏读

设置当前会话隔离级别为读未提交

读未提交隔离级别设置

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

1、a 事务(客户端1) 修改 、未提交

在这里插入图片描述

2、b事务(客户端2) 读该数据

在这里插入图片描述

3、a事务(客户端1) 回滚

在这里插入图片描述

4、b事务(客户端2) 再读该数据 和 2步不一致,脏读

在这里插入图片描述

读已提交----->不可重复读

设置当前会话隔离级别为读已提交

在这里插入图片描述

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

1、a事务(客户端1) 修改 、未提交

在这里插入图片描述

2、b事务(客户端2) 读该数据

在这里插入图片描述

3、a事务(客户端1) 提交

在这里插入图片描述

4、b事务(客户端2) 读该数据 , 不可重复读

在这里插入图片描述

可重复读----->幻读

设置当前会话隔离级别为可重复读

在这里插入图片描述

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

1、a 事务(客户端1) 修改、未提交

在这里插入图片描述

2、b 事务(客户端2) 读该数据

在这里插入图片描述

3、a 事务(客户端1) 提交

在这里插入图片描述

4、b 事务(客户端2) 读该数据 和之前一样可重复读

在这里插入图片描述

串行化

设置当前会话隔离级别为串行化

在这里插入图片描述

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

1、a 事务(客户端1) 读取id = 1的数据

在这里插入图片描述

2、b 事务(客户端2) 修改id = 1的数据,直接阻塞住

在这里插入图片描述

3、a 事务(客户端1) 提交

在这里插入图片描述

4、b 事务(客户端2) 获取行锁更新成功、串行执行

在这里插入图片描述

五、MVCC(Multi-Version Concurrency Control)

MVCC原理底层就是通过read view 以及undo log来实现

为什么会有MVCC

频繁加锁会导致数据库性能低下,引入了MVCC多版本控制来实现读写不阻塞,提高数据库性能,在多版本并发控制中,为了保证数据操作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被操作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的,对于数据的更新(包括增删改)操作成功,会将这个版本号更新到数据的行中,事务提交成功,将新的版本号更新到此数据行中,这样保证了每个事务操作的数据,都是互不影响的,也不存在锁的问题。

MVCC在哪个隔离级别下才生效

MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作。其他两个隔离级别和MVCC不兼容,因为 READ UNCOMMITTED 总是读取最新的数据行,而不是符合当前事务版本的数据行。而 SERIALIZABLE 则会对所有读取的行都加锁。

InnoDB行数据默认隐藏列

InnoDB在每行数据都增加三个隐藏字段:一个唯一行号,一个记录创建的版本号,一个记录回滚的版本号。

ReadView是什么

在我们平时执行一个事务的时候,就会生成一个ReadView,ReadView的组成结构大致如下:
READVIEW

read view 参数解释

1.creator_trx_id: 当前事务id

没什么可解释,就是当前事务ID

2.m_ids:所有活跃事务的事务id

当前所有未提交的事务id构成的集合

3.min_trx_id: m_ids里最小的事务id值

当前所有未提交的事务id构成的集合里的最小的哪个事务id

4.max_trx_id: 最大事务id

下一个即将创建的事务id

Read View快照的生成时机

repeatable read级别

语句级快照

read committed级别

事务级的快照

版本链比对规则

  1. 如果被访问版本的trx_id属性值与rv中的creator_trx_id值相同 可见
  2. 如果被访问版本的trx_id属性值小于rv中的min_trx_id值 可见
  3. 如果被访问版本的trx_id属性值大于或等于rv中的max_trx_id值 不可见
  4. 如果被访问版本的trx_id属性值在rv的min_trx_id和max_trx_id之间
    4.1 trx_id在m_ids中 不可见
    4.2 trx_id不在m_ids中 可见

一句话概括MVCC

MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。

MVCC比对练习题

mvcc

在同一个事务里,针对id=1的记录,当前事务ID分别为200,99,38,15,5的行记录能查询到么,是可见的么?

200不可见、99可见、38可见、15不可见、5可见

思考题:为啥要把最小的事务id值单独作为一个字段?

时间复杂度,难道要从所有未提交的集合中去找么,依次遍历

六、Mysql解决了幻读么,当前读呢

在InnoDB引擎下的的repeatable read (可重复复读)隔离级别下,快照读MVCC影响下,已经解决了幻读的问题(因为它是读历史版本的数据),而如果是当前读(指的是 select * from table for update),则需要配合间隙锁来解决幻读的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吧佬联手抵制奸商,百元级游戏电脑横出江湖

最近小忆闲得在电商平台搜索了下关键词「游戏主机」,不出意外销量榜前列清一色全是「i9 级高端游戏主机」。 这些主机不论配置单介绍还是十万百万级销量宣传标语,都给人一种血赚不亏的「豪华」感。 咱就说时代在变,唯一不变的是奸商们的套路与…

指针函数和函数指针

本文目录 • 前言 • 一、返回指针的函数 二、指向函数的指针回到顶部 一、返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的。 返回指针的函数的一般形式为:类型名 * 函数名(参数列表) 比如下面这个函数&#…

「Codeforces」771-div2 E. Colorful Operations

E. Colorful Operations https://codeforces.com/contest/1638/problem/E 题目描述 给你一个数组,默认初始元素为 0 ,颜色为 1,有三种操作: Color l r c:将 [l, r] 区间内的颜色修改为 cAdd c x:将所有颜…

SpringBoot整合Minio,一篇带你入门使用Minio

本文介绍SpringBoot如何整合Minio,解决文件存储问题 文章目录 前言环境搭建项目环境搭建添加依赖库yml配置 Docker安装minio 代码实现MiniConfigservicecontroller 测试 前言 参考链接: 官网 环境搭建 项目环境搭建 将minio单独封装成一个module&am…

LeetCode单链表OJ题目做题思路分享

目录 移除链表元素链表的中间节点链表中倒数第K个节点合并两个有序链表 移除链表元素 链接: link 题目描述: 思路分享: 我们上个博客分享了第一种方法,下面我们分析第二种方法:思路就是将每一个不等于我们要删除的值的节点依次尾…

如何快速获取已发表学术论文的期刊封面及目录(caj格式下载和caj转pdf)

目录 1 下载caj格式的封面和目录 2 CAJ格式的封面和目录转PDF格式 在进行职称评审或成果申报时,一般要求提交你发表的成果所在的期刊的当期封面和目录。本文就手把手带带你制作一个期刊目录。 重要提示:下载期刊封面和目录需要你有知网账号&#xff0…

Java读取Properties配置文件的6种方式

Java读取Properties的方式 项目结构:经典的maven项目结构 配置文件1和2内容一致: jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urlmysql://localhost:3306/database?useUnicodetrue&characterEncodingutf-8&serverTimezoneAsia/Shanghai jdbc.…

【深度学习】计算机视觉(13)——模型评价及结果记录

1 Tensorboard怎么解读? 因为意识到tensorboard的使用远不止画个图放个图片那么简单,所以这里总结一些关键知识的笔记。由于时间问题,我先学习目前使用最多的功能,大部分源码都包含summary的具体使用,基本不需要自己修…

找高清无水印视频素材,就上这9个网站。

推荐几个我的视频素材库,有免费、收费、商用,希望对大家有帮助! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 菜鸟图库可以找到设计、办公、图片、视频、音频等各种素材。视频素材就有上千个,全部都很高清&…

unityt光线透射目标

介绍 在Unity中,光线透射目标通常指的是在场景中放置的一些物体,用于模拟光线从一个物体透过到另一个物体的效果。canvas子物体组件中,勾不勾选“光线透射目标”有什么区别? 方法 在Canvas子物体组件中勾选“光线透射目标”时&…

Python基础合集 练习17(类与对象)

class Dog: pass papiDog() print(papi) print(type(papi)) 构建方法 创建类过后可以定义一个特殊的方法。在python中构建方法是__init__(),init()必须包含一个self参数 class pig(): #def__init__(self) -> None: print(‘你好’) pipgpig() 属性和方法 cl…

C++好难(2):类和对象(上篇)

okay,从这里开始,就进入c比较难的部分了~啊啊啊!!! (﹃ԅ) 坚持坚持啦 ~ ᵎ(•̀㉨•́)و ̑̑ 【本章目标】 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实…

(1)QT基础铺垫

目录 1.Qt特性 2. 新建项目 3. 工作目录与构建目录 4. 工作目录 4.1 .pro 项目配置文件 4.2 dialog.h 4.3 dialog.cpp 4.4 main.cpp 5. 帮助文档 6. 调试信息 1.Qt特性 Qt经常被当作是一个基于c语言的gui开发框架,但是这并不是qt的全部,除了开…

JavaWeb( 二 ) URL

1.4.URL统一资源定位符 URL代表Uniform Resource Locator 统一资源定位符,也叫 URL地址 。是用于标识和定位Web上资源的地址,通常用于在Web浏览器中访问网站和文件。 URL由若干部分组成,scheme:// host : port / path 例如: htt…

WxGL应用实例:绘制点云

WxGL附带了几个工具函数,其中read_pcfile用来解析.ply和.pcd格式的点云文件,该函数返回一个PointCloudData类实例,包含以下属性: PointCloudData.ok - 数据是否可用,布尔型PointCloudData.info - 数据可用性说明&…

《通过十几轮数据进行模型训练,实现精确的无创血糖测量的演绎学习》阅读笔记

目录 0 演绎学习 1 论文摘要 2 论文十问 3 论文亮点与不足之处 4 与其他研究的比较 5 实际应用与影响 6 个人思考与启示 参考文献 0 演绎学习 在本文中,DL指的是Deduction Learning,即演绎学习方法。该方法是一种机器学习方法,通过使…

简单毛概刷题网页制作 3.0(拖欠近一年版)

原因是大概一年之前学校的毛概期末刷题网站突然崩了,但是一直没有修复。当时眼看着复习时间逐渐被压缩,自己啥也做不了,遂自学前端完成毛概刷题网页一枚。 最早的毛概刷题网站仅仅是 1.0 版本(传送门),功能…

STM32F4_USMART调试组件

目录 1. USMART是什么? 2. USMART的特点 3. USMART实现流程 4. USMART组件 5. 在usmart_config.c中添加想要被USMART调用的函数 6. 实验程序 6.1 main.c 6.2 usmart.c 6.3 usmart.h 7. USMART调试的优越性说明 1. USMART是什么? USMART 是 AL…

org.apache.poi 设置 Excel 单元格颜色 RGB

一、背景说明 在使用 org.apache.poi 导出 Excel 时,需要设置部分单元格的颜色。 可以使用方法:org.apache.poi.ss.usermodel.CellStyle.setFillForegroundColor() 和 org.apache.poi.ss.usermodel.CellStyle.setFillPattern() 来设置单元格的颜色和填…

低频量化之 可转债 配债数据及策略 - 全网独家

目录 历史文章可转债配债数据 待发转债(进展统计)待发转债(行业统计)待发转债(5证监会通过,PE排序)待发转债(5证监会通过,安全垫排序)待发转债(5证…