当前位置: 首页 > news >正文

mysql事务的隔离级别学习

事务的隔离级别:

ⅰ. 读未提交
ⅱ. 对已提交 (解决 脏读)
ⅲ. 可重复读 (解决 不可重复读)
ⅳ. 串行化 (解决 脏读 不可重复读 幻读 问题 )

隔离级别分类如下,在不同的隔离级别下可能产生不同的问题,如脏读、不可重复度、幻读等,我们会在后边的课程中一一讲解:隔离级别	脏读	不可重复读	幻读	解决方案
Read uncommitted(读未提交)	√	√	√	
Read committed(读已提交)	×	√	√	undo log
Repeatable read(可重复读)	×	×	√	MVCC版本控制+间隙锁(mysql的rr不存在幻读)
Serializable(串行化)	×	×	×	
show variables like 'transaction_isolation'; # 查看mysql 事务的隔离级别变量

在mysql中查看和设置【事务的隔离级别】,语法如下:

-- 查看全局和当前事务的隔离级别
SELECT @@global.transaction_isolation, @@transaction_isolation_isolation;
show variables like 'transaction_isolation';
--5.7   tx_isolation
--8.0   transaction_isolation-- 设置下一个事务的隔离级别
SET transaction isolation level read uncommitted;
SET transaction isolation level read committed;
set transaction isolation level repeatable read;
SET transaction isolation level serializable;
-- 设置当前会话的隔离级别
SET session transaction isolation level read uncommitted;
SET session transaction isolation level read committed;
set session transaction isolation level repeatable read;
SET session transaction isolation level serializable;
-- 设置全局事务的隔离级别
SET GLOBAL transaction isolation level read uncommitted;
SET GLOBAL transaction isolation level read committed;
set GLOBAL transaction isolation level repeatable read;
SET GLOBAL transaction isolation level serializable;其中,SESSION 和 GLOBAL 关键字用来指定修改的事务隔离级别的范围:
SESSION:表示修改的事务隔离级别将应用于当前 session(当前 cmd 窗口)内的所有事务;
GLOBAL:表示修改的事务隔离级别将应用于所有 session(全局)中的所有事务,且当前已经存在的 session 不受影响;
如果省略 SESSION 和 GLOBAL,表示修改的事务隔离级别将应用于当前 session 内的下一个还未开始的事务。
ⅴ. #1、读未提交(RU)
【ru隔离级别】说的简单一点就是,一个事务可以读取其他【未提交的事务】修改的数据,
这种隔离级别最低,一般情况下,数据库隔离级别都要高于该级别,该隔离级别下,可能会存在脏读、
不可重复度,幻读的问题。
**脏读:**指的是一个事务读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,
读到的数据不一定准确。

案例:

模拟转账

使用两个窗口,开启两个事务,且将隔离级别设置为RU(读未提交)。

1. 读未提交 情况:

事务2 读取到了事务 1 未提交的数据 (id= 2行数据) 当 事务1 回滚后 id=2 数据 重新 恢复

事务 1

事务 2

ⅵ. 、读已提交(RC)

【RC读已提交】说的是当前事务只能读到别的事物已经提交的数据,该隔离级别可能会产生不可重复读和幻读。

【不可重复读】的官方解释是:【一个事务】(A事务)修改了【另一个未提交事务】(B事务)读取过的数据。那么B事务【再次读取】,会发现两次读取的数据不一致。也就是说在一个原子性的操作中一个事务两次读取相同的数据,却不一致,一行数据不能重复被读取。主要是【update】语句,会导致不可重复读。

案例:

  1. 修改事务 的隔离级别 为 read commit;

事务1 可以看到 在同一个事务中 有不同的 读取 结果 即为 不可重复读

原因是在另一个事务中提交了 数据的修改

当隔离级别设置为Read committed 时,避免了脏读,但是可能会造成不可重复读。

大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。

ⅶ. 3、可重复读(RR)

学习完不可重复读,理解【可重复读】就简单多了,他的意思是,同一个事务中发出同一个SELECT语句【两次或更多次】,那么产生的结果数据集总是相同的,在RR隔离级别中可能出现幻读。

**幻读:**一个事务按照某些条件进行查询,事务提交前,有另一个事务插入了满足条件的其他数据,再次使用相同条件查询,却发现多了一些数据,就像出现了幻觉一样。幻读主要针对针对delete和insert语句。

不可重复读强调的是两次读取的数据【内容不同】,幻读前调的是两次读取的【行数不同】。

案例

  1. 设置 事务的隔离级别

在 一个事务中 插入一行数据,但在另一个数据中却查不到 ,可以看到在可重复读的隔离级别中,

幻读问题是得到一定解决的。

但当我 们在 同一个事务中 更新 一下,再查询一下时我们发现了 一个牛逼的现象, 我们在另一个事务中添加的数据出现了 ,幻读问题出现。

*注意:**在mysql中的RR隔离级别中,innodb使用mvcc+锁帮我们解决了绝大部分的幻读情况,上边的例子稍微修改一下,我们就能看到幻读现象了。
ⅷ. 4、串行化 (相当于给每张表上了一个写锁)
  • 事务A和事务B,事务A在操作数据库时,事务B只能排队等待
  • 这种隔离级别很少使用,吞吐量太低,用户体验差

这种级别可以避免“幻读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行,而不发。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于SpringBoot+Vue+MySQL的家乡特色推荐系统
  • 视觉SLAM ch5——相机与图像
  • C++:内部类,匿名对象,操作符new与delete
  • Linux环境使用Git同步教程
  • 大模型学习起步的经验分享
  • vue的插槽
  • Lucene详解介绍以及底层原理说明
  • 数学建模常用模型全面总结(含适用条件、优点、局限性和应用场景)
  • Windows11 WSL2的ubuntu 22.04中拉取镜像报错
  • 电脑怎么设置开机密码?3个方法迅速搞定!
  • [数据集][目标检测]无人机飞鸟检测数据集VOC+YOLO格式6647张2类别
  • 面向切面:单元测试、事务、资源操作
  • Python编程 - 协程
  • pybind11 学习笔记
  • 【项目设计】Facial-Hunter
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • Angular 响应式表单之下拉框
  • Angular2开发踩坑系列-生产环境编译
  • Centos6.8 使用rpm安装mysql5.7
  • centos安装java运行环境jdk+tomcat
  • Git学习与使用心得(1)—— 初始化
  • javascript数组去重/查找/插入/删除
  • JS题目及答案整理
  • python_bomb----数据类型总结
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • underscore源码剖析之整体架构
  • Vim Clutch | 面向脚踏板编程……
  • Vue官网教程学习过程中值得记录的一些事情
  • 安装python包到指定虚拟环境
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端_面试
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 日剧·日综资源集合(建议收藏)
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 一个完整Java Web项目背后的密码
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #pragma once与条件编译
  • #stm32驱动外设模块总结w5500模块
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)计算机毕业设计大学生兼职系统
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十)T检验-第一部分
  • (十三)Flask之特殊装饰器详解
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .a文件和.so文件
  • .gitattributes 文件
  • .NET 的程序集加载上下文
  • .net反混淆脱壳工具de4dot的使用
  • .NET开发不可不知、不可不用的辅助类(一)