封锁-封锁模式(共享锁、排他锁)、封锁协议(两阶段封锁协议)

一、引言

1、封锁技术是目前大多数商用DBMS采用的并发控制技术,封锁技术通过在数据库对象上维护锁来实现并发事务非串行调度的冲突可串行化

2、基于锁的并发控制的基本思想是:

当一个事务对需要访问的数据库对象,例如关系、元组等进行操作之前,要先向系统发出封锁请求,获得所访问的数据库对象上的锁,即对数据库对象进行加锁来限制并发的其他事务对这些数据对象的访问

3、DBMS采用的封锁模式均包括共享锁和排它锁,同时采用两阶段封锁协议来约定锁的使用,保证并发事务非串行调度的可串行化

二、封锁模式

由于事务对数据库对象的操作分为读操作和写操作,因此,常用的封锁模式中也有两种类型的锁,一种用于读,称作共享锁,简称S锁,又称作读锁

一种用于写,称作排他锁,简称X锁,又称作写锁

1、共享锁

(1)若事务T想读取数据库对象A而不更新A,事务T必须申请获得A上的共享锁

(2)若申请成功,则事务在数据库对象A上加共享锁,事务T可以读A但不能写A

(3)其他事务只能再对A加共享锁,而不能加排他锁

这就保证了其他事务可以读A,但在事务T释放A上的共享锁之前,不能对A作任何更新

2、排他锁

(1)若事务T不仅要读取数据库对象A还要更新A ,事务T必须申请获得A上的排他锁

(2)若申请成功,则事务T在数据库对象A上加排他锁,事务T不仅可以读A还能写A

(3)其他事务不能对A加任何类型的锁

 这就保证了在事务T释放A上的排他锁之前,其它事务不能再读取和更新A

3、对于任何数据库对象A,其上只能有一个排他锁,或者没有排他锁而有多个共享锁,也就是有多个事务可以同时读取A,但只能有一个事务读取并更新A

4、为了使并发执行的事务提早执行或提前完成,提高事务的执行效率。如果一个事务T想要读数据库对象A并可能更新A,应首先申请A上的一个共享锁,获得A上的共享锁后,友好地对待其他事务,允许其他事务申请并获得A上的共享锁,同时读取A,而仅当事务T准备为A写入新值时,再申请将加在A上的共享锁升级为排他锁。而事务T的锁升级请求是否会得到满足,则要看此时数据库对象A上的加锁情况

5、在同一数据库对象上已经被某事务加锁的情况下,并发控制机制能否同意其他事务的封锁申请的策略,可用一个锁相容矩阵来描述

在锁相容矩阵中,最左边一列表示在某数据库对象事务T1已经获得的锁,S为共享锁,X为排他锁,—表示没有加锁,最上边一行表示另一事务T2该数据库对象发出的封锁请求,T2的封锁请求能否被满足,用矩阵中的Y和N来表示,Y即YES,表示T2申请的锁与T1已拥有的锁相容,封锁请求可以满足,N即NO,表示事务T2申请的锁与T1已持有的锁冲突,T2的封锁请求被拒绝

6、现在我们知道如何使用锁了,对于我们上一节所提到的这个非可串行化的调度,如果我们在调度中,当事务对需要访问的数据库对象进行操作之前,要先向系统发出封锁申请,在读之前申请读锁并获得锁,在写之前升级为写锁并获得锁,写完释放锁。

这里用Slock(A)表示在某数据对象A上加上共享锁,Xlock(A)表示在A上加上排他锁,Unlock(A)表示释放A上的锁,也称解锁。可以发现,虽然我们正确地进行了封锁操作,但并没有解决该并发事务的非可串行化问题

三、封锁协议

1、在利用封锁技术对并发事务进行操作时,需要对事务何时申请要访问的数据库对象上的锁何时释放所获得的锁等约定一些规则,即封锁协议

2、约定不同的规则就形成了各种不同的封锁协议

3、两阶段封锁协议是最常用的一种实现可串行化的封锁协议

四、两阶段封锁协议

两阶段封锁协议对事务调度中的封锁操作的顺序进行限制,要求在每个事务中,所有的加锁操作优先于所有解锁操作,即每个事务在对数据库对象进行封锁时,必须分获得锁和释放锁两个阶段

1、第一阶段是获得锁阶段,也称扩展阶段

  • 在这个阶段,事务要申请得到完成事务操作所需要的所有锁,只能申请锁不能释放锁

2、第二阶段是释放锁阶段,也称收缩阶段 

  • 在这个阶段,事务释放所获得的所有锁不能再申请任何锁

若事务遵循两阶段封锁协议,其封锁操作序列应类似这种形式

先是对需要访问的各数据对象加锁,然后再开始释放锁,实际应用中,为了便于阶段的划分,通常将释放锁阶段放在事务结束时的COMMIT或ROLLBACK操作中完成

因此许多DBMS的并发控制机制,采用严格的两阶段封锁协议实现并发事务的可串行化

3、其协议规则包含如下具体内容

  • 事务T在读一个数据库对象前,必须获得该数据库对象上的读锁,如果没有其他事务拥有这个数据库对象上的写锁,那么事务T的封锁请求得到满足,操作继续执行
  • 事务T在更新一个数据库对象前,必须获得该数据库对象上的写锁,如果没有其他事务拥有这个数据库对象上的读锁或写锁,那么事务T的封锁请求得到满足,操作继续执行。若事务T已具有该数据库对象上的读锁,则必须将读锁升级为写锁,也必须获得该数据库对象上的写锁
  • 若事务B的封锁请求与事务A已获得的锁不相容时,事务B将处于等待状态,直到事务A释放其所拥有的锁为止
  • 事务所获得的锁将一直保持到事务结束才释放。即直到事务提交或终止且提交或终止日志记录已被刷新到磁盘后,事务才允许释放锁

这就是严格封锁协议的要求

3、前面我们对这个非串行化调度进行的封锁操作,并没有解决并发事务的非可串行化问题。若采用严格的两阶段封锁协议,事务T1在读取数据库对象X之前,申请并获得读锁,写数据库对象之前升级读锁为写锁,写后并没有释放锁,然后事务T2对数据库对象X申请的读锁,与事务T1已持有的数据库对象X上的写锁不相容,封锁请求得不到满足,事务T2处于等待状态,事务T1继续完成对数据库对象Y的读写,事务执行完成,提交后才释放数据库对象X和Y上的锁,事务T2才能够开始执行,事务T2在事务T1释放锁之前被拒绝执行,推迟了将导致非可串行化的操作的执行,调度的执行实际上相当于事务T1先于T2的一个串行调度,实现了并发事务的可串行化

4、对于我们在上一节讨论的并发事务带来的数据不一致问题,比如“脏读”问题,事务T1在完成之前发生了故障,需撤销回滚,事务T2读取了夭折事务T1对X的中间更新结果,是一个脏数据

 

若采用严格两阶段封锁协议进行并发控制,在事务T2因对数据库对象X申请的读锁与事务T1已持有的数据库对象上的写锁不相容而处于等待状态时,事务T1在完成之前发生了故障,则事务T1终止并撤销回滚,将X的值恢复为事务开始时的值,事务T1结束才释放所持有的数据对象X上的锁,事务T2才能够开始执行,此时事务T2读取的是夭折事务T1 ROLLBACK后的值,即事务T1没执行前的值,是数据库处于一致性状态时的值,不再是脏数据 

五、小结

1、封锁技术通过共享锁间的相容性,以及排他锁的排他性,使得并发调度中的非冲突操作并发执行,冲突操作串行执行,实现了冲突可串行化

2、采用封锁技术进行并发控制的DBMS,在具体实现时使用的锁类型,除了共享锁和排他锁两种基本锁外,为了事务能够高效地并发执行并减少死锁的发生,还会使用一些其他类型的锁,形成相应的封锁策略及对应的锁相容矩阵,以及采用更能便于应用执行的封锁协议,而不一定是可串行化的严格的两阶段封锁协议

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ-订阅一致及解决方案

背景 这里借用Rocketmq官方的一句话来描述订阅关系一致: 订阅关系一致指的是同一个消费者分组Group ID下,所有Consumer实例所订阅的Topic和Tag必须完全一致。如果订阅关系不一致,可能导致消息消费逻辑混乱,消息被重复消费或遗漏。 具体的问题…

BS结构的毕业设计题目管理系统-计算机毕业设计源码92342

目 录 摘要 1 绪论 1.1 研究背景 1.2目的及意义 1.3论文结构与章节安排 2 毕业设计题目管理系统设计分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分…

3D打印推动透气钢革命

在科技日新月异的今天,3D打印技术如同一股强劲的潮流,正悄然改变着制造业。从简单的塑料玩具到复杂的工业部件,再到高精尖的医疗器械,3D打印技术凭借其独特的优势,不断拓宽着应用的边界。今天,我们一起深度…

Linux-DNS

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。…

MySQL/SqlServer 跨服务器 增删改查(CRUD) 的一种方法

前言:主要是利用SqlServer 的链接服务器功能 1.准备一台 SqlServer Server,服务如下图: 这台服务器专门用于 链接服务器 IP:10.x.x.3 和数据源服务器(10.x.x.5) 在一个局域网 1.1 版本 是 2017 2.在 10.…

算法体系-26 第二十六节:第26节:单调栈结构 (5节)

一 单调栈知识讲解 1.1描述 一个数组里面想的到每个位置与他最近的左边和右边比他小的最近的信息 1.2 分析 通过单调栈的特点,for遍历数组中的每个数,当前数来的时候对比单调栈中的数进行每个数的左右判断完满足条件的进行更新到当前i种的 int[][] re…

MySQL索引教程(01):创建索引

文章目录 MySQL 创建索引索引介绍MySQL CREATE INDEX 语法MySQL 索引类型MySQL CREATE INDEX 实例结论 MySQL 创建索引 对于一个具有大量数据行的表,如果你根据某个查询条件检索数据时很慢,可能是因为你没有在检索条件相关的列上创建索引。 索引类似于…

平价猫粮新选择!福派斯鲜肉猫粮,让猫咪享受美味大餐!

福派斯鲜肉猫粮,作为一款备受铲屎官们青睐的猫粮品牌,凭借其卓越的品质和高性价比,为众多猫主带来了健康与美味的双重享受。接下来,我们将从多个维度对这款猫粮进行解析,让各位铲屎官更加全面地了解它的魅力所在。 1️…

查看电脑显卡(NVIDIA)应该匹配什么版本的CUDA Toolkit

被串行计算逼到要吐时,决定重拾CUDa了,想想那光速般的处理感觉(夸张了)不要太爽,记下我的闯关记录。正好我的电脑配了NVIDIA独显,GTX1650,有菜可以炒呀,没有英伟达的要绕道了。回到正…

详细分析SQL语句中的硬解析、软解析、软软解析基本知识

目录 前言1. 基本知识2. Demo 前言 从实战中探索 图为全局搜索且在高并发下,会引发硬解析,导致CPU崩溃 1. 基本知识 解析 (parsing) 是数据库在处理 SQL 语句时必不可少的一步,它将 SQL 语句转换为数据库可以执行的低级指令 硬解析 (Hard…

昇思25天学习打卡营第18天|Pix2Pix实现图像转换

Pix2Pix概述 Pix2Pix是基于条件生成对抗网络实现的一种深度学习图像转换模型。Pix2Pix是将cGAN应用于有监督的图像到图像翻译,包括生成器和判别器。 基础原理 cGAN的生成器是将输入图片作为指导信息,由输入图像不断尝试生成用于迷惑判别器的“假”图像…

c++ 附赠课程的知识点记录

(1) 静态变量的赋值 再一个例子: (2) 一般在定义类的赋值运算符函数时, operator ( const A& a ) 函数,应避免自赋值的情况,就是把对象 a 又赋值给 对象a 如同 a a 这样的情况…

类和对象深入理解

目录 static成员概念静态成员变量面试题补充代码1代码2代码3如何访问private中的成员变量 静态成员函数静态成员函数没有this指针 特性 友元友元函数友元类 内部类特性1特性2 匿名对象拷贝对象时的一些编译器优化 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接…

C++ | Leetcode C++题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s;for (int x: nums) {if (s.find(x) ! s.end()) {return true;}s.insert(x);}return false;} };

【PB案例学习笔记】-27制作一个控制任务栏显示与隐藏的小程序

写在前面 这是PB案例学习笔记系列文章的第27篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

视频参考帧和重构帧复用

1、 视频编码中的参考帧和重构帧 从下图的编码框架可以看出&#xff0c;每编码一帧需要先使用当前帧CU(n)减去当前帧的参考帧CU&#xff08;n&#xff09;得到残差。同时&#xff0c;需要将当前帧的重构帧CU*&#xff08;n&#xff09;输出&#xff0c;然后再读取重构帧进行预测…

Pandas数据可视化详解:大案例解析(第27天)

系列文章目录 Pandas数据可视化解决不显示中文和负号问题matplotlib数据可视化seaborn数据可视化pyecharts数据可视化优衣库数据分析案例 文章目录 系列文章目录前言1. Pandas数据可视化1.1 案例解析&#xff1a;代码实现 2. 解决不显示中文和负号问题3. matplotlib数据可视化…

HTTP代理服务器:深度解析与应用

“随着互联网的飞速发展&#xff0c;HTTP代理服务器在网络通信中扮演着越来越重要的角色。它们作为客户端和服务器之间的中介&#xff0c;不仅优化了网络性能&#xff0c;还提供了强大的安全性和隐私保护功能。” 一、HTTP代理服务器的概念与作用 HTTP代理服务器是一种能够接…

Qt扫盲-QRect矩形描述类

QRect矩形描述总结 一、概述二、常用函数1. 移动类2. 属性函数3. 判断4. 比较计算 三、渲染三、坐标 一、概述 QRect类使用整数精度在平面中定义一个矩形。在绘图的时候经常使用&#xff0c;作为一个二维的参数描述类。 一个矩形主要有两个重要属性&#xff0c;一个是坐标&am…

前端面试题16(跨域问题)

跨域问题源于浏览器的同源策略&#xff08;Same-origin policy&#xff09;&#xff0c;这一策略限制了来自不同源的“写”操作&#xff08;比如更新、删除数据等&#xff09;&#xff0c;同时也限制了读操作。当一个网页尝试请求与自身来源不同的资源时&#xff0c;浏览器会阻…