死锁-活锁与活锁的预防、死锁与死锁的预防和检测(处理死锁的方式:事务等待图)

一、引言

1、死锁是因采用封锁技术实现并发控制而产生的一种运行事务被阻塞或等待的现象

2、如果利用严格两阶段封锁协议来解决我们前面提到的“更新丢失”这种数据不一致问题,非串行调度中的事务T1首先获得数据对象X上的读锁并开始执行,随后事务T2也获得数据对象X上的读锁开始执行。当事务T1想对X写入新值时,则需将读锁升级为写锁,但其申请的数据对象X上的写锁与事务T2当前所持有的读锁不相容,事务T1申请的写锁得不到满足,事务T1需要等待,当事务T2想对数据对象X写入新值时,也需将读锁升级为写锁,但其申请的数据对象X上的写锁,也与事务T1当前所持有的读锁不相容,事务T2也不能获得数据对象X上的写锁,事务T2也需要等待,这就造成两个并发事务都不能继续执行,并相互等待对方释放锁,进入死锁状态

3、根据发生死锁时并发事务的等待状态的不同,可将死锁细分为“活死锁”,简称“活锁”和“死死锁”,简称“死锁”,处理死锁的方法包括预防和检测

二、活锁

活锁是指并发事务中有部分事务因封锁请求得不到满足长期处于等待的状态,但其他事务仍可以继续运行下去。处于长期等待状态的事务也称作被“饿死”

比如这里给出的4个并发事务的封锁情况,事务T1首先获得数据对象A上的读锁,事务T2在事务T1没有释放锁前,对数据对象A的写锁申请被拒绝,T2处于等待状态,但事务T3、事务T4对数据对象A的读锁申请可依次得到满足,能够继续执行,导致事务T1释放锁后事务T2仍然处于等待状态,等待其他事务释放锁,形成活锁

三、活锁的预防

避免发生活锁的简单方法是采用先来先服务的策略,当多个事务申请封锁同一数据对象时,按申请封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,申请队列的第一个事务首先获得锁

四、死锁

死死锁是指并发事务中的事务各自拥有某数据库对象上的“锁”,并去申请其他事务对某数据库对象所持有的“锁”,因申请得不到满足而产生的循环等待状态。

比如前面提到的利用严格两阶段封锁协议解决“更新丢失”问题中的事务T1、T2,分别等待对方释放锁,同时又都持有对方所申请的锁,两个事务将一直等待下去,谁也不能完成,形成死锁

利用两阶段进行并发控制,难免会造成并发事务相互间申请与另一个事务已获得的锁不相容的锁或多个事务在同一个数据对象上持有共享锁并都希望将锁升级的现象,从而导致出现死锁

五、死锁的预防和检测

1、因此,DBMS应能够对可能发生的死锁进行处理,处理死锁的方法大致分为两种

(1)一种是预防死锁,即对死锁加以预防,防止发生死锁。预防死锁发生的方法有

  • 一次封锁法。该方法要求每个事务必须获得要访问的所有数据对象上的锁后才能开始执行,而不是先占有部分锁
  • 顺序封锁法。该方法将数据对象按某种顺序排序,所有并发事务也按这个顺序申请数据对象上的锁,那么就不会由于相互等待所需要的锁而导致死锁

 (2)一种是检测并解除死锁即允许死锁发生,但要及时检测并进行解除。检测并解除死锁的方法有

  • 超时回滚法。即对事务的执行时间加以限制,如果某个事务的执行时间超过了这个限制,就认为其发生了死锁,将其回滚 。当一个事务因超时而回滚后,该事务将释放其持有的锁,其他事务则有可能申请到所需要的锁执行完成。比如,在一般事务的执行时间为几毫秒的数据库系统中,以1分钟为超时时限,则超时回滚的应是陷入死锁的事务,该方法实现简单,但仍有可能误判死锁,但超时时限设置得过长,则又不能及时发现死锁

2、DBMS常用的处理死锁的方法是事务等待图法,该方法不仅可预防死锁,也可对死锁进行检测

(1)事务等待图是一个由结点和边构成的有向图。G(T,U)

  • 图中的每个结点表示正在运行的事务
  • 图中的每条有向边表示一个事务在等待获取另一个事务释放其拥有的锁。

比如,在调度中,事务T2先读取数据对象A,可获得A上的读锁,然后事务T1要写数据对象A,则要申请A上的写锁,此时事务T1需要等待事务T2释放其已获取的读锁(r2(A),w1(A)),则在事务等待图中应存在结点T1和T2,并在结点T1和T2之间划一条从T1指向T2的有向边 

(2)用事务等待图可动态反应系统中并发事务申请等待数据对象上的锁的情况

(3)若事务等待图中存在环路,如图中存在由红色有向边构成的有向环路,则表示系统中存在并发事务的循环等待情况,发生了死锁

(4)系统需周期地,比如每隔1min检测事务等待图,当系统检测到事务等待图中存在环路后,将选择环路中一个撤销该事务所需代价最小的事务。比如图中的事务T3,将其回滚,被撤销的事务将不再申请锁,且释放其持有的所有锁原有环路中至少有一个事务,比如图中的事务T2可以执行不用再等待,该事务完成后又会释放其持有的锁,以此类推,原有环路中的其他事务也能陆续执行完成,解除死锁

(5)事务等待图可以用来在死锁形成后检测死锁,也可以用来预防死锁的形成。避免死锁的一种策略就是回滚所提请求将导致等待图中出现环路的任一事务 

3、举例:

 

下面来看在并发事务的该调度执行过程中事务等待图的变化情况

首先事务T1可获得数据对象A上的读锁,读取对象A,然后事务T3可获得数据对象B上的读锁,读取对象B,事务T1又可获得数据对象C上的写锁,写对象C,事务T3又可获得数据对象D上的写锁,写对象D,此时均没有冲突操作,没有事务等待情况

但当事务T2要读数据对象C时,因事务T1已获得数据对象C上的写锁,则事务T2只能等事务T1释放锁,则在事务等待图中,会产生结点T2到结点T1的一条边

当事务T1要写数据对象B时,因事务T3已获得数据对象B上的读锁,则事务T1也只能等事务T3释放锁,则在事务等待图中,会产生结点T1到结点T3的一条边

当事务T4要写数据对象D时,因事务T3已获得数据对象D上的写锁,则事务T4也只能等事务T3释放锁,则在事务等待图中,会产生结点T4到结点T3的一条边

当事务T3要写数据对象A时,因事务T1已获得数据对象A上的读锁,则事务T3也只能等事务T1释放锁,则在事务等待图中会产生结点T3到结点T1的一条边。此时,在事务等待图中出现了环路,即事务T1、事务T3相互等待,发生死锁

将所提请求将导致出现环路的事务T3回滚,释放其拥有的数据对象B和D上的锁,w1(B)和w4(D)操作可继续执行

将事务T1回滚,释放其拥有的数据对象A和C上的锁,r2(C)、w3(A)操作可继续执行

六、小结

1、并发事务因竞争不到所需的共享锁资源,无论是长期等待处于饿死的状态,还是相互等待处于死锁的状态,均要造成系统性能的降低

2、大多数DBMS通过判断事务等待图是否形成环路来避免或解除死锁

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

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

相关文章

算法库应用--Brute - Force算法串匹配(顺序串)

学习贺利坚老师关于B-F算法的算法库 数据结构例程——串的模式匹配(Brute-Force算法)_sqstring s, t; strassign(s,"ababcabcacbabcaccab");-CSDN博客 本人规则解析博客 串的匹配 (Brute - Force 算法)_brute force算法-CSDN博客\ 版本更新日志…

在5G/6G应用中实现高性能放大器的建模挑战

来源:Modelling Challenges for Enabling High Performance Amplifiers in 5G/6G Applications {第28届“集成电路和系统的混合设计”(Mixed Design of Integrated Circuits and Systems)国际会议论文集,2021年6月24日至26日,波兰洛迪} 本文讨…

跟着峰哥学java 第四天 商品分类 前后端显示

1.后端 1.1mybatis-plus分页查询配置 在商品热卖数据中,只让其显示八条数据 将要使用分页 也就是service.page方法 此时需要配置 mp拦截器 Configuration public class MybatisPlusConfig {Beanpublic PaginationInterceptor paginationInterceptor() {return …

宝可梦 第一到第五时代 神兽 幻兽 准神宝可梦盘点

小时候特别喜欢看宝可梦 也玩过一些宝可梦类游戏 而宝可梦中 大家最喜欢的莫过于神兽 今天 我们来盘点一下 宝可梦各世代的神兽 以及准神宝可梦 第一世代 一级神 超梦 属性: 超能力 是火箭队根据梦幻基因制造的一只人造传说宝可梦。 一直是一只热度非常高的宝可梦&#xf…

图书管理系统 全栈项目分享

文章目录 项目简要说明项目开源地址b站视频演示技术栈部分效果展示 项目简要说明 本项目是我的数据库课设,个人感觉做得还行,目前项目开源,README文档里有项目的介绍和使用说明,这里就不一一赘述了 项目开源地址 github - libr…

MobaXterm不显示隐藏文件

MobaXterm在左边显示隐藏文件,以.开头的文件,想让它不显示,点击红框按钮就可以了

Ubuntu 20版本安装Redis教程

第一步 切换到root用户,使用su命令,进行切换。 输入: su - 第二步 使用apt命令来搜索redis的软件包,输入命令:apt search redis 第三步 选择需要的redis版本进行安装,本次选择默认版本,redis5.…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实…

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库,这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念:用户属于部门,部门拥有 角色,则又多了一层: user-…

小暑节气,选对劳保鞋,让安全与清凉同行

在七月炽热的阳光下,我们迎来了二十四节气中的小暑,标志着盛夏时节的正式开始。随着气温的节节攀升,不仅大自然万物进入了生长的旺季,我们的工作与日常生活也面临着新的挑战——如何在高温环境下保障自身安全,成为了不…

计算机网络——数据链路层(以太网)

目录 局域网的数据链路层 局域网可按照网络拓扑分类 局域网与共享信道 以太网的两个主要标准 适配器与mac地址 适配器的组成与运作 MAC地址 MAC地址的详细介绍 局域网的mac地址格式 mac地址的发送顺序 单播、多播,广播mac地址 mac帧 如何取用…

Spring源码十四:Spring生命周期

上一篇我们在Spring源码十三:非懒加载单例Bean中看到了Spring会在refresh方法中去调用我们的finishBeanFactoryInitialization方法去实例化,所有非懒加载器单例的bean。并实例化后的实例放到单例缓存中。到此我们refresh方法已经接近尾声。 Spring的生命…

提升系统稳定性:熔断、降级和限流策略详解

文章目录 前言一、熔断(Circuit Breaker)二、降级(Degradation)三、限流(Rate Limiting)四、应用案例五、小结推荐阅读 前言 随着互联网业务的快速发展,系统稳定性和高可用性成为现代分布式系统…

【Python机器学习】算法链与管道——网格搜索预处理步骤与模型参数

我们可以利用管道将机器学习工作流程中的所有处理步骤封装成一个scikit-learn估计器。这么做的好处在于:现在我们可以使用监督任务(分类或回归)的输出来调节预处理参数。 下面用一个管道来完成一个建模过程。管道包含了3个步骤:缩…

ELK优化之Filebeat部署

目录 1.安装配置Nginx 2.安装 Filebeat 3.设置 filebeat 的主配置文件 4.修改Logstash配置 5.启动配置 6.kibana验证 主机名ip地址主要软件es01192.168.9.114ElasticSearches02192.168.9.115ElasticSearches03192.168.9.116ElasticSearch、Kibananginx01192.168.9.113ng…

【C语言】register 关键字

在C语言中,register关键字用于提示编译器将变量尽量存储在CPU的寄存器中,而不是在内存中。这是为了提高访问速度,因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

iOS多target时怎么对InfoPlist进行国际化

由于不同target要显示不同的App名称、不同的权限提示语,国际化InfoPlist文件必须创建名称为InfoPlist.strings的文件,那么多个target时怎么进行国际化呢?步骤如下: 一、首先我们在项目根目录创建不同的文件夹对应多个不同的targe…

自闭症儿童的治疗方法有哪些?

身为星贝育园自闭症儿童康复学校的资深教育者,我深知自闭症谱系障碍(ASD)儿童的教育与治疗需要一个全面、个性化的方案。在星贝育园,我们致力于为孩子们提供一个充满爱与理解的环境,采用多种科学验证的教育方法&#x…

商贸物流大脑:大模型+数据要素赋能智慧物流数据平台

项目背景与意义 物流行业快速发展,数据量急剧增加,随着电子商务、智能制造等领域的快速发展,物流行业面领着前所未有的挑战和机遇,如效率低下、资源配置不均、信息不透明等问题。随着全球化和电子商务的快速发展,数据…

Arthas实战(5)- 项目性能调优

1、接口耗时查询:trace命令 trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。 1.1 准备测试应用 新建一个 SpringBoot 应用,写一耗时久的代码&…