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

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

一、引言

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

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

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

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

二、封锁模式

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

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

1、共享锁

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

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

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

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

2、排他锁

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

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

(3)事务T和其他事务不能对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,在具体实现时使用的锁类型,除了共享锁和排他锁两种基本锁外,为了事务能够高效地并发执行并减少死锁的发生,还会使用一些其他类型的锁,形成相应的封锁策略及对应的锁相容矩阵,以及采用更能便于应用执行的封锁协议,而不一定是可串行化的严格的两阶段封锁协议

相关文章:

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

一、引言 1、封锁技术是目前大多数商用DBMS采用的并发控制技术,封锁技术通过在数据库对象上维护锁来实现并发事务非串行调度的冲突可串行化 2、基于锁的并发控制的基本思想是: 当一个事务对需要访问的数据库对象,例如关系、元组等进行操作…...

跨境干货|最新注册Google账号方法分享

谷歌账号对做跨境外贸业务的人来说是刚需,目前来说大部分的海外社媒平台、工具都可以用谷歌账号来注册。但是仍然有很多朋友并不知道如何注册这个谷歌账号,今天就来给大家分享2个注册谷歌账号的方法,一个是手机号注册,一个是如何跳…...

MySQL第三天作业

一、在数据库中创建一个表student,用于存储学生信息 CREATE TABLE student( id INT PRIMARY KEY, name VARCHAR(20) NOT NULL, grade FLOAT ); 1、向student表中添加一条新记录 记录中id字段的值为1,name字段的值为"monkey"…...

网络安全应急处理流程

网络安全应急处理流程是指在发生网络安全事件时,组织应采取的一系列措施,以快速响应、控制、恢复和调查网络安全事件,确保业务连续性和数据安全。以下是一个详细的网络安全应急处理流程: 1. 准备阶段 目标:建立和维护…...

昇思25天学习打卡营第12天 | LLM原理和实践:MindNLP ChatGLM-6B StreamChat

1. MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 ChatGLM-6B应该是国内第一个发布的可以在消费级显卡上进行推理部署的国产开源大模型,2023年3月就发布了。我在23年6月份的时候就在自己的笔记本电脑上部署测试过,当…...

中英双语介绍加拿大多伦多(Toronto)

中文版 多伦多概述 多伦多(Toronto)是加拿大最大的城市,也是北美地区重要的经济、文化和金融中心。以下是对多伦多的详细介绍,包括其经济地位、金融中心、人口、地理位置、高等教育、移民政策、著名景点和居住的名人等方面的信息…...

【YOLOv9教程】如何使用YOLOv9进行图像与视频检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...

Text2SQL提问中包括时间的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

点胶系统实战1-项目介绍

准备实战开发如下图的多轴点胶系统实战课程,内容设计界面开发、运动板块开发、任务管理、点胶的控制等。我们将和进入这个领域的初学者门一起进步。 有感兴趣的小伙伴,可以关注点赞,或评论区反馈你们的重点关注的内容,那些部分我…...

【MYSQL】InnoDB引擎为什么选可重复读作为默认隔离级别

InnoDB引擎为什么选可重复读作为默认隔离级别 一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQL Server等,而MySQL却使用可重复读(Read-Repeatable&#x…...

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…...

基于Android Studio订餐管理项目

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 能够实现登录&#xff0c;注册、首页、订餐、购物车&#xff0c;我的。 用户注册后&#xff0c;登陆客户端即可完成订餐、浏览菜谱等功能&#xff0c;点餐&#xff0c;加入购物车&#xff0c;结算&#xff0c;以及删减…...

华为OSPF配置DR和BDR与指定DR

基础配置 <Huawei>sys #进入配置模式 Enter system view, return user view with CtrlZ. [Huawei]un in en #关闭报文弹窗 Info: Information center is disabled. [Huawei]sys R1 #设备名更改为R1 [R1]int g0/0/0 …...

【学习笔记】程序设计竞赛

程序设计竞赛 文章目录 程序设计竞赛0x00 基本操作指南0x01 算法分析0x02 STL和基本数据结构栈队列集合map 0x03 排序插入排序归并排序&#xff08;Merge Sort)快速排序 0x04 搜索技术BFSDFS回溯与剪枝 深度迭代ID A*A star双向广搜 0x05 递推方程0x06 高级数据结构并查集二叉树…...

11-云服务器处理单细胞转录组数据

目录 安装R及相关包 安装 shiny 进行安装包 安装BiocManager 安装Seurat包 网页端Rstudio需打开8787端口 Ubuntu上安装R包linux库缺失 关于服务器配置及相关处理可见:linux学习笔记_hx2024的博客-CSDN博客 安装R及相关包 8-阿里云服务器 ECS配置R及Studio Server-CS…...

vs+qt5.0 使用poppler-qt5 操作库获取pdf所有文本输出到txt操作

先获取poppler库&#xff0c;编译出lib与dll&#xff0c;配置好依赖环境&#xff0c;获取某页所有文本&#xff1a; QList<QString> PDFkitEngine::GetText(int nPageNum) { QList<QString> lstText; Poppler::Page* pPage NULL; pPage GetPage(nPageNu…...

[AIGC] ClickHouse分布式表与本地表的区别及如何查询所有本地表记录

在大规模数据处理和分析场景中&#xff0c;ClickHouse是一种高性能的列式数据库管理系统。ClickHouse支持分布式表和本地表两种表类型&#xff0c;本文将介绍这两种表类型的区别&#xff0c;并探讨如何建表以查询所有本地表的记录。 文章目录 一、ClickHouse分布式表与本地表的…...

202406 CCF-GESP Python 四级试题及详细答案注释

202406 CCF-GESP Python 四级试题及详细答案注释 1 单选题(每题 2 分,共 30 分)第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( ) A. 1 B. 2 C. 3 D. 4答案:C解析:目前CCF组织的GESP认证考试有C++、Pyth…...

政安晨:【Keras机器学习示例演绎】(五十二)—— 使用门控残差和变量选择网络进行分类

目录 简介 数据集 安装准备 数据准备 定义数据集元数据 创建用于训练和评估的 tf.data.Dataset 创建模型输入 对输入特征进行编码 实施门控线性单元 实施门控余留网络 实施变量选择网络 创建门控残差和变量选择网络模型 编译、训练和评估模型 政安晨的个人主页:政…...

Spring AOP、Spring MVC工作原理、发展演变、常用注解

Spring AOP 概念 AOP全称为Aspect Oriented Programming&#xff0c;表示面向切面编程。切面指的是将那些与业务无关&#xff0c;但业务模块都需要使用的功能封装起来的技术。 AOP基本术语 **连接点&#xff08;Joinpoint&#xff09;&#xff1a;**连接点就是被拦截到的程序执…...

grid布局下的展开/收缩过渡效果【vue/已验证可正常运行】

代码来自GPT4o&#xff1a;国内官方直连GPT4o <template><div class"container"><button class"butns" click"toggleShowMore">{{ showAll ? 收回 : 显示更多 }}</button><transition-group name"slide-fade&…...

Qt/C++编写地图应用/离线地图下载/路径规划/轨迹回放/海量点/坐标转换

一、前言说明 这个地图组件写了很多年了&#xff0c;最初设计的比较粗糙&#xff0c;最开始只是为了满足项目需要&#xff0c;并没有考虑太多拓展性&#xff0c;比如最初都是按照百度地图写死在代码中&#xff0c;经过这几年大量的现场实际应用&#xff0c;以及大量的用户提出…...

最新版Python安装教程

一、安装Python 1.下载Python 访问Python官网&#xff1a; https:/www.oython.orgl 点击downloads按钮&#xff0c;在下拉框中选择系统类型(windows/Mac OS./Linux等) 选择下载最新稳定版本的Python 以下内容以演示安装Windows操作系统64位的python 左边是稳定发布版本Stabl…...

1.3镜像管理

【必知必会】了解镜像的命名及导入导出镜像 1.3.1镜像的命名 一般情况下,镜像是按照如下格式命名的 服务器ip:端口/分类/镜像名:tag 如果不指明端口,默认是80,tag是latest,比如:192.168.26.101:5000,再比如hub.c.163.com/library/mysql:latest.分类也可以不写,比如d…...

黑马|最新AI+若依 |初识项目

本章主要内容是&#xff1a; 1.快速搭建了若依前后端项目在本地 2.实现了单表的增删改查快速生成 文章目录 介绍1.若依介绍2.若依的不同版本3.项目运行环境 初始化前后端项目1.下载若依项目2.初始化后端a.把表导入到数据库中b.更改application.yml文件 3.初始化前端a.安装依赖…...

ArrayList综合案例-模拟外卖中的商家系统

一案例要求&#xff1a; 二代码要求&#xff1a; package 重修;import java.util.ArrayList; import java.util.Random; import java.util.Scanner;import static java.lang.System.exit;public class first {public static void main(String[] args) {Scanner scnew Scanne…...

Postgres JSON字段怎么修改key的名称

场景 当你不小心将 key 的名称写错了&#xff08;人员类别&#xff1a;多了一个冒号&#xff09;&#xff0c;或者想把引文改为中文&#xff08;type改为类型&#xff09; 大致思路是添加一个新的 key&#xff0c;然后将旧的 key 删除 sql语句 假如 JSON 列为 extra&#x…...

GStreamer学习5----probe数据探测

参考资料&#xff1a; gstreamer中如何使用probe&#xff08;探针&#xff09;获取帧数据_gstreamer 视频编码时获取视频关键帧信息-CSDN博客 Gstreamer中可以使用AppSink作为一个分支来查看管线中的数据&#xff0c;还可以使用probe去处理。 在GStreamer中&#xff0c;probe…...

Open3D 点云的圆柱形邻域搜索

目录 一、概述 1.1原理 1.2应用 二、代码实现 2.1完整代码 2.2程序说明 三、实现效果 3.1原始点云 3.2搜索后点云 一、概述 1.1原理 圆柱邻域搜索的基本思想是确定点云中的哪些点位于给定圆柱的内部。一个圆柱可以由以下几个参数定义&#xff1a; 中心点&#xff1a;…...

python如何设计窗口

PyQt是一个基于Qt的接口包&#xff0c;可以直接拖拽控件设计UI界面&#xff0c;下面我简单介绍一下这个包的安装和使用&#xff0c;感兴趣的朋友可以自己尝试一下&#xff1a; 1、首先&#xff0c;安装PyQt模块&#xff0c;这个直接在cmd窗口输入命令“pip install pyqt5”就行…...