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

隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

一、引言

1、DBMS除了采用严格的两阶段封锁协议来保证并发事务的可串行化,实现事务的隔离性,也可允许用户选择一个可以保证应用程序正确执行并且能够使并发度最大隔离性等级

 2、通常用隔离级别来描述隔离性等级,以下将主要介绍ANSI 92标准定义的4个隔离级别

二、隔离级别中的锁协议

1、事务封锁的数据对象保持锁的时间不同,从而产生不同的封锁协议

(1)有些隔离级别要求把锁保留到事务提交的时候,这种锁称为“长期锁

(2)而有的隔离级别只把锁保留到语句执行完毕就释放,这种锁称为“短期锁

(3)在所有的隔离级别上写锁都是长期锁

(4)读锁在每个隔离级别上的处理方式不同

比如SQL Server多粒度封锁模式中的TABLOCK锁就是短期锁,HOLDLOCK保持锁是长期锁

实际的DBMS将不同的读锁和写锁进行组合运用,同时结合多粒度封锁,就形成了不同的封锁协议

2、ANSI用4个隔离级别定义这些封锁协议用每个级别满足的数据一致性来命名

三、隔离级别类型

1、对于READ UNCOMMITTED读未提交隔离级别

(1)运行在该隔离级别下的事务,没有获得读锁也可执行读操作 

(2)即事务可以读取其他事务已经在其上加了写锁的数据

(3)因此,该事务可能会读取没有提交事务所写的脏数据

脏读有时是严重的,有时是无关紧要的,当某事务只想尽快地大概了解一下数据库的当前状态并不太关心数据的准确性,则该事务就可运行在该隔离级别下而不用为了不脏读而进行耗时的等待

2、对于READ COMMITTED读提交隔离级别

(1)运行在该隔离级别下的事务,读数据之前要获得数据对象上的读锁,若该数据对象上已经加写锁,则要等到该数据对象上的写锁释放

(2)因此,事务只会读取其他事务提交后的数据不会读取脏数据

(3)但该事务的读锁是短期锁,读操作完成后就释放了读锁,若有另一个事务随后对该事务所读的数据进行了更新并提交,则该事务对同一数据对象进行的再次读取的结果与前一次是不一样的,会出现不可重复读问题

3、对于REPEATABLE READ可重复读隔离级别

(1)运行在该隔离级别下的事务,要获取SELECT语句读取的查询结果中每个元组上的长期读锁,即保持读锁直到事务提交

(2)因此,该事务对查询结果中元组的再次查询不存在不可重复读问题

(3)但在该事务执行时,可能有其他事务向数据库插入满足该SELECT语句查询条件的新元组,从而导致该事务中该SELECT语句的再次执行有可能检索到前次查询没有检索到的新元组,出现了幻影现象,新出现的元组称为幻影元组

4、对于SERIALIZABLE可串行化隔离级别,该隔离级别对应的就是严格的两阶段封锁协议

(1)运行在该隔离级别下的事务,在进行所有数据对象的读操作之前都要求获得长期读锁

(2)对关系表做查询,锁会加在关系表上,不会有幻影现象

(3)事务的执行是可串行化的

四、隔离级别的设置

1、SQL语言提供了在事务执行前对事务的隔离级别进行设置的功能,使得同一个应用程序的不同事、务,也可以在不同的隔离级别下执行 

2、这里给出一种设置隔离级别的语句格式:

SET TRANSACTION ISOLATION LEVEL <隔离级别>

3、语句中的隔离级别可以是ANSI标准中4个隔离级别类型中的任何一个,遵循该标准的DBMS会有自己默认的隔离级别,通常为READ COMMITTEDREPEATABLE READ利用该设置语句才能改变隔离级别,并可能影响随后定义的其他事务 

 五、隔离级别应用

1、需要说明的是,隔离级别是运行在该隔离级别下的事务遵循的封锁协议。事务加锁的类型、封锁粒度及保持锁的时间、产生的数据不一致问题等只与自身的隔离级别有关,与并发的其他事务的隔离级别无关,也不会影响到其他隔离级别下的事务对数据的读写方式。

事务中的操作能否执行并发事务在共享对象上的封锁情况有关

2、下面我们基于创建的学生选课数据库,通过两个并发事务的执行,来理解隔离级别对事务中数据操作的影响

3、首先来看一下两个事务在默认隔离级别,即READ COMMITTED读提交隔离级别下并发执行的情况

我们通过在SQL Server的对象资源管理器上打开两个查询窗口来执行两个并发事务,请在事务的并发执行过程中,认真观察并发调度中每一步的执行结果分析操作的封锁情况以及事务的并发性数据的一致性

 (1)在查询窗口1开始执行事务T1,首先对关系表SC进行查询

BEGIN TRAN T1SELECT * FROM SC;

(2)再在查询窗口2开始执行事务T2,修改学号为‘202218014030’的学生的成绩,操作可执行 

BEGIN TRAN T2UPDATE SCSET GRADE=GRADE+50 WHERE SNO='202218014030';SELECT * FROM SC;

查询可看到SC表中SNO='202218014030'的记录的GRADE值被更新,说明事务T1的读锁是短期锁,读锁只保持到语句执行完毕

(3)返回到查询窗口1,事务T1再次进行同样的查询,

BEGIN TRAN T1SELECT * FROM SC;SELECT * FROM SC;

可以看到查询不能执行,说明事务T2中“写锁”是长期锁,事务T2写完并没有释放锁,事务T1不能读未提交事务T2所写的数据,即不会读取脏数据

(4)返回到查询窗口2,提交事务T2

BEGIN TRAN T2UPDATE SCSET GRADE=GRADE+50 WHERE SNO='202218014030';SELECT * FROM SC;
COMMIT TRAN T2

再返回到窗口1,发现事务T1可进行查询,但查询结果中SNO为‘202218014030’ 的元组的GRADE值与前一次查询不一致了,事务T1出现了不可重复读现象

这个例子说明默认隔离级别为READ COMMITTED,该隔离级别读锁是短期锁,只保持到语句执行完毕,事务不会读取“脏数据”,但会出现“不可重复读”现象

4、再来看一个在REPEATABLE READ可重复读隔离级别下的事务与两个在默认隔离级别,即READ COMITTED读提交隔离级别下的事务并发执行的情况

(1)在查询窗口1开始执行事务T1前,设置隔离级别为REPEATABLE READ可重复读,然后开始执行事务T1,首先对SC表中学号SNO='2022018014030'的元组进行查询,留意查询结果

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRAN T1SELECT * FROM SC WHERE SNO='202218014030';

(2)在查询窗口2,在默认隔离级别下执行事务T2,首先修改学号SNO='202218014032'的学生的成绩,通过比较更新前后查询结果可看到更新可以实现

BEGIN TRAN T2SELECT * FROM SC WHERE SNO='202218014032';UPDATE SC SET GRADE=GRADE+2 WHERE SNO='202218014032';SELECT * FROM SC WHERE SNO='202218014032';

(3)接着在修改学号SNO='202218014030'的学生的成绩,操作不能执行,说明事务T1的读锁是加在元组上的且读完并没有释放锁

BEGIN TRAN T2SELECT * FROM SC WHERE SNO='202218014032';UPDATE SC SET GRADE=GRADE+2 WHERE SNO='202218014032';SELECT * FROM SC WHERE SNO='202218014032';UPDATE SC SET GRADE=GRADE+2 WHERE SNO='202218014030';

(4)返回事务T1,重新对SC表中SNO='202218014030'的元组进行查询,发现T1可重复读取数据

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRAN T1SELECT * FROM SC WHERE SNO='202218014030';SELECT * FROM SC WHERE SNO='202218014030';

(5)在查询窗口3中执行单语句事务操作,向表SC中插入一个学号为‘202218014030’的学生的选课元组,会发现操作可以执行,不用等待

INSERT INTO SC VALUES('202218014030','004',70);

(6)返回事务T1,重新对SC表中SNO='202218014030'的元组进行查询,可见事务T1再次查询得到了与上一次不一致的结果,即产生幻影现象

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRAN T1SELECT * FROM SC WHERE SNO='202218014030';SELECT * FROM SC WHERE SNO='202218014030';SELECT * FROM SC WHERE SNO='202218014030';

(7)然后提交事务T1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN TRAN T1SELECT * FROM SC WHERE SNO='202218014030';SELECT * FROM SC WHERE SNO='202218014030';SELECT * FROM SC WHERE SNO='202218014030';
COMMIT

(8)再返回事务T2,可见更新操作已可执行,查询后可看到更新结果

BEGIN TRAN T2SELECT * FROM SC WHERE SNO='202218014032';UPDATE SC SET GRADE=GRADE+2 WHERE SNO='202218014032';SELECT * FROM SC WHERE SNO='202218014032';UPDATE SC SET GRADE=GRADE+2 WHERE SNO='202218014030';SELECT * FROM SC WHERE SNO='202218014030';

这个例子说明,并发事务可在不同的隔离级别下执行

六、小结

1、隔离级别表示在与其他事务并发执行时所能容忍的被其他事务干扰的程度

2、ANSI标准隔离级别中的4个隔离级别,从上到下隔离级别从低到高,隔离级别越高隔离性能越好,相互干扰越小,数据不一致问题越少但事务的并发程度越低

 

相关文章:

隔离级别-隔离级别中的锁协议、隔离级别类型、隔离级别的设置、隔离级别应用

一、引言 1、DBMS除了采用严格的两阶段封锁协议来保证并发事务的可串行化&#xff0c;实现事务的隔离性&#xff0c;也可允许用户选择一个可以保证应用程序正确执行并且能够使并发度最大的隔离性等级 2、通常用隔离级别来描述隔离性等级&#xff0c;以下将主要介绍ANSI 92标准…...

【数据结构与算法】希尔排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​...

【机器学习】(基础篇一) —— 什么是机器学习

什么是机器学习 本系列博客为你从机器学习的介绍开始&#xff0c;使用大量的代码实战和验证&#xff0c;最终帮助你完全掌握什么是机器学习 人工智能、机器学习和深度学习的关系 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;&#xff1a;是一门研…...

VitePress安装部署

VitePress安装部署 VitePress安装步骤 安装 Node环境 官网下载&#xff1a;https://nodejs.org/zh-cn 傻瓜式安装到完成 npm环境 安装完Node环境之后&#xff0c;可以直接运行下面的命令安装npm npm install -g pnpm关于pnpm源&#xff1a; 有时候需要国内源&#xff0c…...

Spring的事务传播机制和隔离级别

Spring 提供了强大的事务管理机制,通过 @Transactional 注解或程序化事务管理方式,开发者可以轻松地在应用中启用事务特性。事务传播机制和隔离级别是 Spring 事务管理中的两个重要方面,了解它们有助于更好地控制事务的行为,确保数据的一致性和完整性。 1. 事务传播机制(…...

华为路由器静态路由配置(eNSP模拟实验)

实验目标 如图下所示&#xff0c;让PC1ping通PC2 具体操作 配置PC设备ip 先配置PC1的ip、掩码、网关。PC2也做这样的配置 配置路由器ip 配置G0/0/0的ip信息 #进入系统 <Huawei>system-view #进入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #设置接口的ip和掩码 […...

antd实现简易相册,zdppy+vue3+antd实现前后端分离相册

前端代码 <template><a-image:preview"{ visible: false }":width"200"src"http://localhost:8889/download/1.jpg"click"visible true"/><div style"display: none"><a-image-preview-group:previe…...

PIP换源的全面指南

##概述 在Python的世界里&#xff0c;pip是不可或缺的包管理工具&#xff0c;它帮助开发者安装和管理Python软件包。然而&#xff0c;由于网络条件或服务器位置等因素&#xff0c;直接使用默认的pip源有时会遇到下载速度慢或者连接不稳定的问题。这时&#xff0c;更换pip源到一…...

陶建辉当选 GDOS 全球数据库及开源峰会荣誉顾问

近日&#xff0c;第二十三届 GOPS 全球运维大会暨 XOps 技术创新峰会在北京正式召开。本次会议重点议题方向包括开源数据库落地思考、金融数据库自主可控、云原生时代下数据库、数据库智能运维、数据库安全与隐私、开源数据库与治理。大会深入探讨这些方向&#xff0c;促进了数…...

Drools开源业务规则引擎(二)- Drools规则语言(DRL)

文章目录 1.DRL文件的组成&#xff1a;2.package3.import4.function5.query6.declare7.global8.rule8.1.规则属性8.2.LHS8.2.1.语法格式8.2.2.运算符优先级8.2.3.特殊的运算符1.matches, not matches2.contains, not contains3.memberOf, not memberOf4.in, notin5.soundslike6…...

PTA甲级1005:Spell It Right

错误代码&#xff1a; #include<iostream> #include<vector> #include<unordered_map> using namespace std;int main() {unordered_map<int, string> map {{0, "zero"}, {1, "one"}, {2, "two"}, {3, "three&qu…...

Vue笔记11-Composition API的优势

Options API存在的问题 使用传统Options API中&#xff0c;新增或者修改一个需求&#xff0c;就需要分别在data&#xff0c;methods&#xff0c;computed里修改&#xff0c;而这些选项分布在代码的各个地方&#xff0c;中间还穿插着其他Optional API&#xff0c;如果代码量上来…...

rancher管理多个集群

一、rancher部署 单独部署到一台机器上&#xff0c;及独立于k8s集群之外&#xff1a; 删除所有yum源&#xff0c;重新建yum源&#xff1a; # 建centos7.9的yum源 # cat CentOS-Base.repo # CentOS-Base.repo # # The mirror system uses the connecting IP address of the …...

某大会的影响力正在扩大,吞噬了整个数据库世界!

1.规模空前 你是否曾被那句“上有天堂&#xff0c;下有苏杭”所打动&#xff0c;对杭州的湖光山色心驰神往&#xff1f;7月&#xff0c;正是夏意正浓的时节&#xff0c;也是游览杭州的最佳时期。这座古典与现代交融的城市将迎来了第13届PostgreSQL中国技术大会。作为全球数据库…...

PostgreSQL主从复制:打造高可用数据库架构的秘籍

PostgreSQL主从复制&#xff1a;打造高可用数据库架构的秘籍 在当今的数字化时代&#xff0c;数据的安全性和可靠性是企业最为关注的问题之一。PostgreSQL作为一种强大的开源关系型数据库管理系统&#xff0c;提供了多种高可用性解决方案&#xff0c;其中主从复制是最为常用的…...

Fast R-CNN(论文阅读)

论文名&#xff1a;Fast R-CNN 论文作者&#xff1a;Ross Girshick 期刊/会议名&#xff1a;ICCV 2015 发表时间&#xff1a;2015-9 ​论文地址&#xff1a;https://arxiv.org/pdf/1504.08083 源码&#xff1a;https://github.com/rbgirshick/fast-rcnn 摘要 这篇论文提出了一…...

视觉语言模型:融合视觉与语言的未来

1. 概述 视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;是能够同时处理和理解视觉&#xff08;图像&#xff09;和语言&#xff08;文本&#xff09;两种模态信息的人工智能模型。这种模型结合了计算机视觉和自然语言处理的技术&#xff0c;使得它们能够在…...

【CSAPP】-linklab实验

目录 实验目的与要求 实验原理与内容 实验步骤 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 实验总结 实验目的与要求 1.了解链接的基本概念和链接过程所要完成的任务。 2.理解ELF目标代码和目标代码文件的基本概念和基本构成 3.了解ELF可重定位目…...

UE C++ 多镜头设置缩放 平移

一.整体思路 首先需要在 想要控制的躯体Pawn上&#xff0c;生成不同相机对应的SpringArm组件。其次是在Controller上&#xff0c;拿到这个Pawn&#xff0c;并在其中设置输入响应&#xff0c;并定义响应事件。响应事件里有指向Pawn的指针&#xff0c;并把Pawn的缩放平移功能进行…...

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...