数据库事务隔离级别的总结

news2024/11/25 20:46:59

一、数据库四种隔离级别

  1. RU(READ-UNCOMMITTED)
    读取事务未提交的数据。
  2. RC(READ-COMMITTED)
    读取到事务已提交的数据。
  3. RR(REPEATABLE-READ)
    可重复读
  4. SR(SERIALIZABLE)
    串行化

二、四种隔离级别与脏读、幻读、不可重复读

在这里插入图片描述
要想了解什么是脏读、幻读、不可重复读,可前往《看图说话:对脏读、不可重复度、幻读进行总结》。

三、MVCC

作为下边内容的基础,我们有必要先了解下什么是 MVCC。

MVCC(Multiversion Concurrency Control),即多版本并发控制。

在 MVCC 中,有两种读的概念:「快照读」「当前读」,如下:

  1. 快照读
    所谓 「快照读」,就是将此刻数据库的状态或者查询结果作为一个快照记录下来,像我们通常的查询(不加锁的查询)就属于快照读,例如:select * from t_user where …

    对于 「快照读」,我们需要注意的是 TA 在 RC 和 RR 中的表现是不一样的:

    • 在 RC 中,每次读取都会生成一个基于数据库最新状态的一个快照。
    • 在 RR 中,快照只会在事务中第一次查询的时候生成,只有在当前事务中发生了数据修改才会触发更新快照。
  2. 当前读
    所谓 「当前读」,就是读取当前数据库的最新数据,例如:加锁的 select for updatde,update,insert,delete 都属于当前读。

    这里要提下应该如何理解 update,delete 当前读(因为他们都不是读操作啊为啥叫当前读),要知道 update 和 delete 是要先找到对应的数据才能进行操作的(所以这里实际上也有读),举个例子,在 RR 下,事务A中的 update 可以更新不存在该事务中的数据,即可以在事务A中对事务B中 insert 的一条数据进行 update 操作。

四、RR 是如何解决幻读问题的?

这里要从两个方向来进行说明,如下:

  1. 普通查询(select)
    基于 MVCC,我们知道普通查询是快照读,回顾下上边提到的知识点:在 RR 中,快照只会在事务中第一次查询的时候生成,只有在当前事务中发生了数据修改才会触发更新快照,看下图:
    在这里插入图片描述
    总结:「普通查询」是通过每次读取相同的快照来解决幻读的问题。

  2. 加锁查询(select for update)
    「普通查询」是通过每次读取相同快照来解决了幻读的问题,那加锁的查询呢?TA 不读快照,读取的最新的数据?这种情况下如何解决幻读呢?

    这里提出了一个概念 「间隙锁」,也就是在 select for update 的时候,不但会对查出的记录加锁,同时会对记录之间的间隙加锁,这就是所说的 「间隙锁」

    由于记录之间也被加了锁,导致其他事务的操作(INSERT or DELETE)将会被阻塞,一直到上一个事务释掉锁,其他事务才能执行。也正是因为其他事务的操作(INSERT or DELETE)无法执行,也就无法使查询结果产生变化(变多或者变少),这样也就避免了出现幻读的情况。

    总结:在 RR 级别中发生「当前读」的情况(即select for update),是通过「间隙锁」来防止幻读的。

综上所诉,RR 是通过「MVCC」和「间隙锁」来解决幻读问题的。

五、为什么我说“RR只是有限的解决了幻读的问题”

上边说的就是在 RR 级别下产生幻读全部场景了吗?为什么我会在开头的时候说 RR 只是有限的解决了幻读问题?下面我们再来看两个场景,如下图:

  1. 场景一
    在这里插入图片描述
    由于第三次查询是当前读,并没有读取快照,所以造成第三次和前两次查询的结果不一致。

  2. 场景二
    在这里插入图片描述
    由于当前事务中发生了数据修改,触发了快照更新,所以造成的了第三次查询与前两次查询的结果不一致。

六、SpringBoot 中的事务隔离级别

  1. DEFAULT:默认值,DEFAULT 是 SpringBoot 的默认隔离级别,表示使用底层数据库的默认隔离级别。
    大部分数据库为 READ COMMITTED,MySql 默认隔离级别为 REPEATABLE READ
  2. READ UNCOMMITTED:读未提交
  3. READ COMMITTED:读已提交
  4. REPEATABLE READ:可重复读
  5. SERIALIZBLE:串行化

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

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

相关文章

chisel入门初步1——基4的booth编码的单周期有符号乘法器实现

基4的booth编码乘法器原理说明 基2的booth编码 本质来说就是一个裂项重组,乘法器最重要的设计是改变部分积的数量,另外在考虑有符号数的情况下,最高位符号位有特别的意义。 (注:部分积是指需要最后一起加和的所有部分…

Qt6入门教程 8:信号和槽机制(连接方式)

目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 一.一个信号与槽连接…

统信UOS上使用liveCD解决系统使用问题

原文链接:统信UOS上使用liveCD解决系统使用问题 大家好!继我们上次关于UDOM工具箱的深入探讨之后,今天我带来了另一项实用的技巧——在统信UOS上使用liveCD来解决系统相关的问题。 liveCD是一个非常强大的工具,它可以让您在不影响…

Skywalking链路追踪

目录 一、简介1.1、APM系统1.2、SkyWalking 简介 二、快速入门2.1、下载、启动2.2、界面认识 三、持久化存储四、告警通知五、自定义追踪-细粒度追踪service方法 一、简介 1.1、APM系统 APM(Application Performance Monitoring)系统是一种用于监控和管…

QT中操作word文档

QT中操作word文档: 参考如下内容: C(Qt) 和 Word、Excel、PDF 交互总结 Qt对word文档操作总结 QT中操作word文档 Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合。ActiveQt由两个模块组成: QAxContainer模…

vue3 实现简单计数器示例——一个html文件展示vue3的效果

目的&#xff1a;作为一个新手开发&#xff0c;我想使用 Vue 3 将代码封装在 HTML 文件中时&#xff0c;进行界面打开展示。 一、vue计数示例 学了一个简单计数器界面展示&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head&…

SSM(Spring,SpringMVC,MyBatis)整合项目

文章目录 SSM(Spring,SpringMVC,MyBatis)整合项目1.创建表2.创建工程3.pom.xml4.log4j.properties5.db.properties6.applicationContext-dao.xml7.applicationContext-tx.xml8.applicationContext-service.xml9.springmvc.xml10.web.xml11.pojo12.mapper13.service14.controlle…

【小笔记】算法训练基础超参数调优思路

【学而不思则罔&#xff0c;思维不学则怠】 本文总结一下常见的一些算法训练超参数调优思路&#xff08;陆续总结更新&#xff09;&#xff0c;包括&#xff1a; batchsize学习率epochsdropout&#xff08;待添加&#xff09; Batch_size 2023.9.29 简单来说&#xff0c;较…

(C++)大数计算问题

文章目录 一、实验目的、内容二、实验程序设计及结构1.需求分析类变量函数 2.设计结构或流程图 三、设计过程四、测试分析第一组第二组实验中出现的bug及解决方案 五、设计的特点和结果 一、实验目的、内容 大数是超过整数表示范围的整数&#xff0c;针对正整数运算&#xff0…

VSCODE使用CMAKE显示命令无法找到

背景&#xff1a;使用了code server&#xff0c;安装CMAKE和CMAKE TOOLS&#xff0c;但是通过ctrlshiftp打开命令面板&#xff0c;运行随便一个cmake指令&#xff0c;都出现了指令无法找到。具体为“命令"CMake: 配置"导致错误 (command ‘cmake.configure’ not fou…

Tomcat10.X部署老版本axis2 webservice项目不生效

目录 一、使用场景 二、问题描述 三、原因排查 四、解决方案 一、使用场景 原来项目是OpenJDK8tomcat9构建&#xff0c;现在需要升级到OpenJDK17tomcat10的组合。原来的webservice项目打包成aar格式&#xff0c;通过axis2部署在tomcat上。 二、问题描述 在配置好jdk和to…

【办公类-21-01】20240117育婴员操作题word合并1.0

背景需求&#xff1a; 最近学校组织老师们学习“育婴员”高级&#xff0c;每周学习2题操作&#xff0c;所以我是把每个学习内容单独做在一个word文件里 上周8套保健操作学完了&#xff0c;需要整理&#xff0c;并将8份Word文件合并 第一步&#xff1a;doc装docx 合并时程序报…

Kafka-消费者-KafkaConsumer分析-ConsumerCoordinator

在前面介绍了Kafka中Rebalance操作的相关方案和原理。 在KafkaConsumer中通过ConsumerCoordinator组件实现与服务端的GroupCoordinator的交互&#xff0c;ConsumerCoordinator继承了AbstractCoordinator抽象类。 下面我们先来介绍AbstractCoordinator的核心字段&#xff0c;如…

mysql 容器化安装(docker)离线和在线

前言&#xff1a;在部署hive或airflow 升级过程中&#xff0c;总需要一个对应的数据库存储元数据&#xff0c;一个轻量级的mysql容器刚刚好。轻量、可快速移植、具有隔离性。 文章目录 1、查看机器版本2、安装 docker3、启动docker 服务4、docker 常用命令docker5、拉取mysql …

更适合3D项目的UI、事件交互!纯国产数字孪生引擎持续升级中!!!

UI和事件交互是3D可视化项目中最常见的模块&#xff0c;主要用于信息添加、展示&#xff0c;用来确保按照用户需求呈现内容并完成交互。 平时工作在进行UI和交互设计时&#xff0c;经常出现以下问题&#xff1a;UI过于复杂导致3D项目内交互效率低下&#xff0c;或者是结合3D项目…

ubuntu18.04 安装mysql(命令)

1.安装MySQL #命令1 sudo apt-get update #命令2 sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 2.2 检查mysql服务状态 systemctl status mysql.service 3.配置远程访问 在Ubuntu下MySQL缺省是只允许本地访问的 3.1 首先用根用户进入…

NR SCell Addition/Modification/Release过程详解

当配置 CA 时&#xff0c;UE 与网络只会有一个RRC 连接。 在 RRC 连接建立/重建/切换时&#xff0c;只有一个serving cell会提供 NAS mobility info&#xff0c;在 RRC connection reestablishment/handover时&#xff0c;同样只有一个serving cell会提供security info&#xf…

关于KT6368A双模蓝牙芯片的BLE在ios的lightblue大数量数据测试

测试简介 关于KT6368A双模蓝牙芯片的BLE在ios的lightblue app大数量数据测试 测试环境&#xff1a;iphone7 。KT6368A双模程序96B6 App&#xff1a;lightblue ios端 可以打开log日志查看通讯流程 测试数据&#xff1a;长度是1224个字节&#xff0c;单次直接发给KT6368A&a…

C++ mapsetOJ

目录 1、138. 随机链表的复制 2、692. 前K个高频单词 3、349. 两个数组的交集 1、138. 随机链表的复制 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;random NULL;} }; */class Solution { pub…

vscode开发java项目

安装java扩展 创建项目 vscode命令行面板搜索java命令行 出现如下提示 No build tools构建项目如下 java项目使用vscode单独打开文件夹&#xff08;工作区中运行有问题&#xff09;&#xff0c;vscode中可直接点击右上角运行按钮执行 maven中spring boot项目 代码错误可以点…