当前位置: 首页 > 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串行,而不发。

http://www.lryc.cn/news/441204.html

相关文章:

  • Chainlit集成Langchain并使用通义千问实现和数据库交互的网页对话应用增强扩展(text2sql)
  • rapidocr 提取汇总
  • Linux:用户账号管理和组账号管理
  • MyBatis-Plus分页查询、分组查询
  • 2024年9月HarmonyOS鸿蒙应用开发者高级认证全新题库(覆盖99%考题)
  • 大工程师插件下载 官方地址
  • rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链
  • 【算法】栈与模拟
  • 【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API
  • System.out源码解读——err 和 out 一起用导致的顺序异常Bug
  • 汽车软件开发之敏捷开发
  • ListBox显示最新数据、左移和右移操作
  • mysql实用系列:日期格式化
  • 时钟频率、AI采样率与AO更新率的关系
  • 代理IP设置后IP不变?可能的原因及解决方法
  • 瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商
  • Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求
  • python 识别省市、区县并组建三级信息数据库
  • 家用小型超声波清洗机怎么选?四大人气爆款品牌不可错过!
  • NVIDIA最新AI论文介绍NEST:一种用于语音处理的快速高效自监督模型
  • 聊聊对别人表示真正的关注
  • 大数据-133 - ClickHouse 基础概述 全面了解
  • 第1步win10宿主机与虚拟机通过NAT共享上网互通
  • Python学习——【2.3】for循环
  • Element UI:初步探索 Vue.js 的高效 UI 框架
  • React Native防止重复点击
  • 如何将Git本地代码推送到Gitee云端仓库
  • 架构师论文备考-论云原生架构及其应用
  • 12.java面向对象:java构造器
  • 微服务之间的安全通信