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

news2024/11/19 18:23:09

一、引言

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.coloradmin.cn/o/1899804.html

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

相关文章

python-21-零基础自学python 写了一个彩票 发现买彩票中了真的是天选

学习内容:《python编程:从入门到实践》第二版 知识点: from random import choice、choice()函数用法、while循环 练习内容: 练习9-14:彩票 创建一个列表或元组,其中包含10个数…

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

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

S32DS S32 Design Studio for S32 Platform 3.5 窗口多开模式

前言 NXP S32系列的芯片,开发默认使用 S32DS,也就是 S32 Design Studio for S32 Platform,当前版本 S32 Design Studio for S32 Platform 3.5,初步体验像是使用 eclipse,作为代码集成开发环境,比如代码阅读…

Hadoop权威指南-读书笔记-02-关于MapReduce

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈😁有兴趣的小伙伴可以去看看原著😊 第二章 关于MapReduce MapReduce是一种可用于数据处理的编程模型。 MapReduce程序本质上是并行运行的&#xff0c…

bert-base-chinese模型离线使用案例

import torch import torch.nn as nn from transformers import BertModel, BertTokenizer# 通过torch.hub(pytorch中专注于迁移学的工具)获得已经训练好的bert-base-chinese模型 # model torch.hub.load(huggingface/pytorch-transformers, model, bert-base-chinese) model…

Vivado FFT IP核使用

1. 今日摸鱼任务 学习Vivado FFT IP核的使用 Vivado_FFT IP核 使用详解_vivado fft ip核-CSDN博客 这篇写的很详细啦 简单做一点笔记进行记录 2. FFT IP核 xfft_0 ff (.aclk(aclk), // input wire aclk.aresetn(aresetn)…

Oracle Database 23ai新特性:增加聚合函数对INTERVAL数据类型支持

在Oracle早期的版本,聚合函数和分析函数MIN/MAX 就支持了INTERVAL 数据类型。但是,当我们使用SUM或AVG函数对INTERVAL 数据类型进行运算时,就会报错。 随着Oracle Database 23ai 的发布,增加了 AVG 以及 SUM 函数对INTERVAL 数据…

SQL 汇总各个部门当前员工的title类型的分配数目

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 有一个部门表…

Python实现ABC人工蜂群优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 人工蜂群算法(Artificial Bee Colony, ABC)是由Karaboga于2005年提出的一种新颖的基于群智能的全局优化…

每日一更 EFK日志分析系统

需要docker和docker-compose环境 下面时docker-compose.yaml文件 [rootnode1 docker-EFK]# cat docker-compose.yaml version: 3.3services:elasticsearch:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"container_name: elasticsearchrestart: …

【python】PyQt5可视化开发,如何设计鼠标显示的形状?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Java 面向对象编程(OOP)的四大特征

Java 面向对象编程(OOP)的四大特征 1、抽象2、继承3、 封装4、多态性 💖The Begin💖点点关注,收藏不迷路💖 在Java编程中,面向对象编程(OOP)是一个核心概念。OOP的四大基…

Cgi上传文件 注意事项

//核心代码 ofstream outfile("/opt/software/" file.getFilename(), ios::out | ios::binary); outfile << file.getData(); //错误方式&#xff1a;outfile << file.getData() <<endl; outfile.close(); 参考博客&#xff1a; https://blog.cs…

设计模式探索:代理模式

1. 什么是代理模式 定义 代理模式是一种结构型设计模式&#xff0c;通过为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和实际对象之间起到中介作用&#xff0c;可以在不改变真实对象的情况下增强或控制对真实对象的访问。 目的 代理模式的主要目的是隐…

基于深度学习的软件漏洞检测模型在现实数据集上的表现

软件漏洞对日常软件系统的影响令人担忧。尽管已经提出了基于深度学习模型的漏洞检测方法&#xff0c;但这些模型的可靠性仍然是一个重大问题。先前的评估报告这些模型具有高达99%的召回率/F1分数&#xff0c;但研究发现&#xff0c;这些模型在实际应用场景下的表现并不佳&#…

【Python系列】数字的bool值

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Qwen2部署实战】Ollama上的Qwen2-7B:一键部署大型语言模型指南

系列篇章&#x1f4a5; No.文章1【Qwen部署实战】探索Qwen-7B-Chat&#xff1a;阿里云大型语言模型的对话实践2【Qwen2部署实战】Qwen2初体验&#xff1a;用Transformers打造智能聊天机器人3【Qwen2部署实战】探索Qwen2-7B&#xff1a;通过FastApi框架实现API的部署与调用4【Q…

Java | Leetcode Java题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> getSkyline(int[][] buildings) {PriorityQueue<int[]> pq new PriorityQueue<int[]>((a, b) -> b[1] - a[1]);List<Integer> boundaries new ArrayList&l…

FIND_IN_SET使用案例--[sql语句根据多ids筛选出对应数据]

一 FIND_IN_SET select id,system_ids from intellect_client_info where FIND_IN_SET(5, system_ids) > 0;

做测试/爬虫 selenium 元素定位 谷歌浏览器 插件推荐,提高元素定位效率

注:插件均在谷歌应用商店 下载 1.XPath Helper 插件 作用&#xff1a;用于Html中对目标字段或者属性值进行匹配 快捷启动&#xff1a;ctrl shift x 示例图如下&#xff1a; 2. ChroPath 插件 作用&#xff1a; 提高元素定位效率 启动&#xff1a;谷歌浏览器 按 F12 -&g…