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

一、引言

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个隔离级别,从上到下隔离级别从低到高,隔离级别越高隔离性能越好,相互干扰越小,数据不一致问题越少但事务的并发程度越低

 

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

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

相关文章

上新:NFTScan 正式上线 Bitcoin-Runes 浏览器!

近日&#xff0c;NFTScan 团队正式对外发布了 Bitcoin-Runes 浏览器&#xff0c;将为 Runes 生态的 NFT 开发者和用户提供简洁高效的 NFT 数据搜索查询服务。Runes 协议的主要目的是定义一种在比特币网络上进行符号化资产交换的方式。它使用 Rune 作为符号化资产的单位&#xf…

【昇思25天学习打卡营打卡指南-第十九天】基于MobileNetv2的垃圾分类

CycleGAN图像风格迁移互换 模型介绍 模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习…

【大模型LLM面试合集】大语言模型基础_NLP面试题

NLP面试题 1.BERT 1.1 基础知识 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是谷歌提出&#xff0c;作为一个Word2Vec的替代者&#xff0c;其在NLP领域的11个方向大幅刷新了精度&#xff0c;可以说是近年来自残差网络最优突破性的…

从零搭建Prometheus到Grafana告警推送

目录 一、Prometheus源码安装和动态更新配置 二、Prometheus操作面板和常见配置 三、Prometheus常用监控组件exporter配置 3.1 exporter是什么 3.2 有哪些exporter 3.3 exporter怎么用 3.4 实战 node_exporter ​3.5 其它exporter都怎么用 四、Promethus整合新版Sprin…

算法mq 交互通用校验模块设计

背景 当前与算法交互均通过rocketMQ异步交互&#xff0c;绝大部分场景一条请求mq消息应对应一条返回mq&#xff0c;但由于各种原因&#xff08;消息积压、程序bug&#xff09;&#xff0c;可能会导致返回mq超时未返回或者消息丢失。工程侧针对一些重要场景 case by case的通过…

基础权限存储

一丶要求 建立用户组shengcan&#xff0c;其id为 2000建立用户组 caiwu&#xff0c;其id 为2001建立用户组 jishu&#xff0c;其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息&#xff08;没有特殊配置的情况下默认直接用全局信息&#xff09; 特定仓库用户信息&#xff08;只针对于当前项目&#xff09; 方法一&#xff1a;修改config文件 方法二&#xff1a;命令方式 2、idea同一代码推向多个远端仓库…

Ubuntu编译 OSG

目录 一、安装步骤 二、配置 1、数据文件配置 2、OSG环境变量配置 一、安装步骤 在Ubuntu上安装OSG(OpenSceneGraph),你可以按照以下步骤操作: 打开终端,更新你的包管理器的包列表: sudo apt update 安装必要的依赖库 sudo apt install libglu1-mesa-dev freeglu…

Java -- 实现MD5加密/加盐

目录 1. 加密的引出2. MD5介绍3. 解决MD5不可解密方法4. 实现加密解密4.1 加密4.2 验证密码 1. 加密的引出 在MySQL数据库中&#xff0c;一般都需要把密码、身份证、电话号码等信息进行加密&#xff0c;以确保数据的安全性。如果使用明文来存储&#xff0c;当数据库被入侵的时…

第七篇——攻谋篇:兵法第一原则——兵力原则,以多胜少

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 微观层面上&#xff0c;也有很多值得深度思考的问题 二、思路&方案 …

CV- 人工智能-深度学习基础知识

一, 深度学习基础知识 1,什么是深度学习?机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。2, 传统机器学习算术依赖人工设计特征,并进行特征提取,而深度学习方法不需要人工,而是依赖算法自动提取特征。深度…

MuLan:模仿人类画家的多对象图像生成

在图像生成领域&#xff0c;处理包含多个对象及其空间关系、相对大小、重叠和属性绑定的复杂提示时&#xff0c;现有的文本到图像模型仍面临挑战&#xff1a;当文本提示中包含多个对象&#xff0c;并且这些对象之间存在特定的空间关系时&#xff0c;现有模型往往难以准确地捕捉…

嵌入式c语言4——类型修饰符

register&#xff0c;将变量保存在寄存器中&#xff0c;使得访问速度增加 const是常量&#xff0c;static是静态量&#xff0c;volatile是

从0-1实现一个前端脚手架

https://gitee.com/childe-jia/kfc-cli.git gitee完整地址 介绍 为什么需要脚手架&#xff1f; 脚手架本质就是一个工具&#xff0c;作用是能够让使用者专注于写代码&#xff0c;它可以让我们只用一个命令就生成一个已经配置好的项目&#xff0c;而不用我们再花时间去配置和安…

zabbix 与 grafana 对接

一.安装 grafana 1.初始化操作 初始化操作 systemctl disable --now firewalld setenforce 0 vim /etc/selinux/config SELINUXdisabled 2.上传数据包并安装 cd /opt grafana-enterprise-9.4.7-1.x86_64.rpm #上传软件包 yum localinstall -y grafana-enterprise-9.4.7-1…

Javascript常见数据结构和设计模式

在JavaScript中&#xff0c;常见的数据结构包括两大类&#xff1a;原始数据类型&#xff08;Primitive Types&#xff09;和对象类型&#xff08;Object Types&#xff09;。对象类型又可以进一步细分为多种内置对象、数组、函数等。下面是一些JavaScript中常见的数据结构&…

PyFluent入门之旅(4)算例求解

在网格划分完成或已有网格的情况下&#xff0c;可以进行算例的求解。 1. 切换/打开求解器 一般启动求解器前有两种情况&#xff1a; 已启动FluentMeshing并生成了网格&#xff0c;需要在不退出FluentMeshing的情况下直接切换至Fluent求解器。已经有现成的网格文件&#xff0…

检测到弱密码:并非所有密码套件均支持完全前向保密解决方案

问题 检测到弱密码&#xff1a;并非所有密码套件均支持完全前向保密&#xff08;弱密码套件 - ROBOT 攻击&#xff1a;服务器支持易受攻击的密码套件&#xff09; 背景介绍 HTTP 协议自身没有加密机制&#xff0c;但可以通过与 TLS (Transport Layer Security) / SSL (Secur…

【AI资讯】快手 可灵web端上线

可灵 AI – 新一代 AI 创意生产力平台 快手 可灵web端上线了&#xff0c;目前登录即可用&#xff0c;感兴趣可以试试。

90元搭建渗透/攻防利器盒子!【硬件篇】

前言 以下内容请自行思考后进行实践。 使用场景 在某些情况下开软件进行IP代理很麻烦&#xff0c;并不能实现真正全局&#xff0c;而且还老容易忘记&#xff0c;那么为了在实景工作中&#xff0c;防止蓝队猴子封IP&#xff0c;此文正现。 正文 先说一下实验效果&#xff1…