数据库事务锁机制的死锁检测方法及装置的制作方法

文档序号:6578553阅读:171来源:国知局
专利名称:数据库事务锁机制的死锁检测方法及装置的制作方法
技术领域
本发明涉及数据库技术领域,尤其涉及一种数据库事务锁机制的死锁检测 方法及装置。
背景技术
事务(Transaction)是数据库管理系统(DBMS)提供的基本也是最重要的 功能之一,而事务功能的实现要依赖2个核心基础技术锁机制和REDO/UNDO 日志功能。锁机制是事务实现的核心技术,它关系到事务功能能否实现,系统 的性能和吞吐量,以及系统的稳定性。
各种数据库管理系统所采用的锁机制的基本理论是一样的,但是实现方法 各有不同。目前主流的凝:据库管理系统,如Oracle, Sybase, MS SQL Server, MySQL (InnoDB)等,都实现自己的一整套锁机制,各有其优缺点。
死锁检测是锁机制的一个关键技术。尽管在某些特定场景中可以使用一些方 法避免和降低死锁发生,但是死锁有时还是难以避免,因此死锁检测成了锁机 制中不可或缺的一部分。死锁检测需要消耗不少计算资源,其效率的好坏对系 统整体性能有不小的影响。
例如,MS SQL Server 2008的死锁4全测方法如下当锁监^L器对特定线程启 动死锁搜索时,会标识线程正在等待的资源。然后,锁监视器查找特定资源的 所有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个循环。用这 种方式标识的循环形成一个死锁。这属于事后检测。再例如,InnoDB的死锁检测也有类似的递归算法,即,事务T1(请求者线 程)要对某个对象obj (表或者记录)加锁,当需要等待时,首先创建一个锁对 象waitjock ,然后事先测试是否发生死锁。它调用 一 个自递归函教: lock_deadlock—recursive (Tl, wait—lock),表示判断在wait—lock之前的力口锁者 (事务)是否等待Tl。具体死锁检测算法如下1)如果加在对象obj上的前一 个锁不存在,则没有死锁,退出。2)判断是否wait—lock需要等待前一个锁lock, 且lock的拥有者T2等于Tl,若是,则表示已经发生死锁,退出。3)得到事务 T2正在等待的锁waitjock2 , 递归调用lock—deadlock—recursive ( Tl , wait_lock2)。可见,InnoDB也是采用递归调用的方式来测试是否出现事务之间 的等待环。
MS SQL Server和InnoDB都是采用递归方式来4企测死锁,特别是InnoDB, 采用双向链表来组织保护对象已授予的锁对象列表,以及事务拥有的锁对象列 表,死锁检测算法遍历这些链表来检测等待环的存在。这种方式检测效率较低, 而且一次检测最多只能检测出一个等待环,同时检测过程对正在进行的线程(事 务)有不小的妨碍。
综上所述,目前大部分数据库管理系统,不管是事先检测还是事后检测, 主要都是利用资源图(已分配资源图和请求资源图)来检测死锁。这种方法的 缺点是丢失了加解锁过程中产生的有助于死锁检测的信息,使得死锁检测时需 要重新计算这些信息,造成死锁检测繁瑣及计算资源的浪费。

发明内容
鉴于上述的分析,本发明旨在提供一种数据库事务锁机制的死锁检测方法及装置,用以解决现有技术中存在的死锁检测繁瑣及计算资源浪费的问题。
本发明的目的主要是通过以下技术方案实现的
本发明提供了一种数据库事务锁机制的死锁检测方法,预定义一个用于存
放线程间等待关系信息的邻接矩阵,则所述方法包括
步骤A:加锁线程将加锁过程中生成的线程间等待关系信息记录在所述邻 接矩阵中;
步骤B:解锁线程在解锁过程中根据需要更新所述邻接矩阵中的相应等待关 系信息;
步骤C:死锁检测线程利用所述邻接矩阵及图论原理对所述线程进行检测计 算,从而判断是否存在死锁。
进一步地,所述步骤A具体包括
在对某锁对象进行加锁的过程中,当加锁线程要申请的锁类型与该锁对象 已授予其他线程的锁类型不相容时,将加锁线程等待其他线程的等待关系信息 记录在所述邻接矩阵中;
加锁线程挂起等待相关线程进行解锁。
进一步地,所述步骤B具体包括
步骤B1:在相关线程进行解锁过程中,进行解锁的线程称为解锁线程;解锁 线程对于所述邻接矩阵中记录的要申请解锁线程正在释放的这把锁的每个线 程,判断它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容, 执行步骤B2;若相容,则执行步骤B3;
步骤B2:保持等待关系信息不变;
步骤B3:判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清除 原来的线程间等待关系信息。
进一步地,所述步骤C具体包括
步骤Cl:死锁检测线程拷贝所述邻接矩阵的一个备份;
步骤C2:利用备份的邻接矩阵中的线程间等待关系信息及图论原理中的拓 朴排序方法对所述线程进行检测计算,检测线程间是否存在死锁回路,如果存 在,则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败
返回,乂人而v5皮除死锁状态。
进一步地,所述步骤C2中的具体包括
步骤C21:计算所述邻接矩阵的入度数组和出度数组,并判断入度数组是否 等于出度数组,如果是,执行步骤C22,否则执行步骤C23;
步骤C22:入度数组是否是0向量,如果是,则计算结束;否则根据预定策 略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回;
步骤C23:清除所有出度不为且O入度为0的元素,并转到步骤C21。
本发明实施例还提供了 一种数据库事务锁机制的死锁检测装置,所述装置 包括信息存储模块、死锁检测模块、每个线程中包含的信息记录模块和信息 更新模块,其中,
所述信息记录模块,用于将加锁过程中生成的线程间等待关系信息记录到 所述信息存储模块中;
所述信息更新模块,用于在解锁过程中根据需要更新所述邻接矩阵中的相 应等待关系信息;
所述信息存储模块,用于以预定义邻接矩阵的形式保存线程间等待关系信息;
所述死锁检测模块,用于根据所述信息存储模块存放的线程间等待关系信 息及图论原理对线程进行检测计算,从而判断是否存在死锁。
进一步地,所述信息记录模块具体用于, 在加锁过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类 型不相容时,所述信息记录模块将加锁线程等待其他线程的等待关系信息记录 在所述信息存储^f莫块中,然后挂起等待相关线程进行解锁。
进一步地,所述信息更新模块具体用于,在相关线程进行解锁过程中,判 断所述信息存储模块中记录的要申请这把锁的每个线程,它所要申请的锁类型 是否与该解锁线程拥有的锁类型相容,若不相容,则保持等待关系信息不变,
若相容,则进一步判断是否与至少一个其他线程拥有的锁类型不相容,如果是, 则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清 除原来的线程间等待关系信息。
进一步地,所述死锁检测模块具体用于,拷贝所述信息存储模块中的矩阵 数据作为一个备份,利用备份的矩阵数据及图论原理对所述线程进行检测计算, 检测线程间是否存在死锁回路,当确认存在死锁回路时,根据预定策略在所述 死锁回路中选择一个线程作为牺牲线程,让其失败返回。
本发明有益效果如下
本发明所提出的技术方案具有极高的死锁检测速度,而且能够充分利用加 解锁过程获得的有用信息来帮助随后的检测死锁,节约了计算资源。
本发明的其他特征和优点将在随后的说明书中阐述,并且,部分的从说明 书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可
9通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获 得。


图1为本发明实施例所述死锁检测方法的主体流程示意图; 图2为本发明实施例所述方法中,死锁检测信息更新的流程示意图; 图3为本发明实施例所述方法中,死锁检测算法的流程示意图; 图4为本发明实施例所述方法中,用有向图描述的发生死锁现象的场景示 意图5为本发明实施例所述方法中,应用图3所述算法检测到死锁前邻接矩 阵的状态图6为本发明实施例所述方法中,应用图3所述算法检测到死锁后邻接矩 阵的状态图7本发明实施例所述装置的结构示意图。
具体实施例方式
本发明的主要内容为,线程在加锁和解锁过程中产生和维护死锁检测信息, 然后利用死锁检测信息及aov网络原理对线程进行拓朴排序,从而判断是否存 在死锁。
下面结合附图来具体描述本发明的优先实施例,其中,附图构成本申请一 部分,并与本发明的实施例一起用于阐释本发明的原理。
首先结合附图1到附图4对本发明实施例所述方法进行详细说明。
如图1所示,图1为本发明实施例所述死锁检测方法的主体流程示意图,主要包括2个阶段,即,死锁检测信息的收集和利用死锁检测信息检测死锁状 态。所述死锁检测信息是指线程间的等待关系信息,所述等待关系信息全部存
储在在一个邻接矩阵中,这个矩阵叫做aov,它记录线程之间的等待关系信息。
这里,加锁线程负责生成线程间等待关系信息,解锁线程负责在解锁过程中根 据需要更新线程间的等待关系信息,死锁检测线程负责根据加解锁过程收集到
的等待关系信息,利用aov网络原理,对线程进行拓朴排序,借以判断是否存 在死锁,以及存在的循环等待环。 具体可以包括以下步骤
步骤101:在加锁过程中,加锁线程如果需要等待其他线程,则将这个线程 间等待关系信息记录在邻接矩阵aov中;
步骤102:在解锁过程中,解锁线程根据需要更新线程之间的这种等待关系 信息,更改aov邻接矩阵中的相应数据;
步骤103:死锁;险测线程先拷贝aov邻接矩阵(aov邻接矩阵构成一个有向 图G)的一个备份,接着应用aov网络拓朴排序的方法对备份数据进行运算,查 找其中的循环等待环(死锁回路)去掉所有没有前驱的结点以及所有它发出的 弧,如果所有结点都可以去掉,则说明没有发生死锁,结束检测;否则说明存 在死锁回路,根据预定策略(可以根据用户需要进行制定,比如最小代价策略, 即选择工作量最小的线程作为牺牲线程),选耳又每个环中的一个结点作为死锁斗企 测的牺牲线程。这里,死锁检测可以由 一个后台独立线程(死锁检测线程)定 期执行(事后^r测),也可以在加锁过程中即时检测(事先检测)。
需要说明的是,我们不是机械地照搬aov网络理论,aov网络主要是用来评 估工程进度图的可行性,它用顶点表示活动,用弧表示活动间的优先关系。而
ii我们主要是借用aov网络的特点来作为死锁检测的有力工具1) aov网络中的 弧表示活动之间存在的某种制约关系,2) aov网络中不能出现回路。本发明用 顶点表示线程本身,用弧表示线程之间的等待关系,当aov网络中不存在回路 时表明不存在死锁,否则至少存在一个死锁。需要指出的是,并不是所有线程 之间都存在等待关系,所有直接或者间接存在等待关系的线程构成一个狭义的 小aov网络,本发明实施例所述的aov邻接矩阵中可能存在若千个这样的小aov 网络。
下面进一步对本发明实施例所述方法进行详细说明。 死锁冲全测信息生成(即步骤101 )过程具体包括
在对某个锁对象(例如,lm)加锁的过程中,如果当前线程i要申请的锁类 型与lm已授予其他线程(任取其中一个线程j)的锁类型不相容,则当前线程i 就需要挂起等待。在挂起等待之前,在aov的i行j列记录这个等待关系信息(表 示线程i等待线程j ),而在唤醒并且获得申请的锁之后清空。
线程i申请锁对象lm的某个类型的锁,当该类型锁与lm已授予线程j的锁 类型不相容时,表明线程i至少需要等待线程j释放相应类型的锁才能成功获得 申请的锁类型。这样,线程i和线程j之间存在着某种偏序关系(等待关系), 在有向图中用结点i到结点j的 一条弧来表示,在aov邻接矩阵中则是在aov[i] [j] 单元中记录线程i正在等待的通知事件event的指针。
当线程j释放已获得的锁类型时,线程i和线程j之间的等待关系可能需要 调整。
如图2所示,图2为本发明实施例所述方法中死锁检测信息更新(步骤102) 的流程示意图,具体可以包括步骤201:线程j在对某个锁对象lm解锁的过程中,检查aov邻接矩阵中 第j列中记录的等待这把锁的第一个线程t;
步骤202:判断线程t所要申请的锁类型与线程j拥有的锁类型是否相容, 若是,执行步骤203,否则转到步骤205;
步骤203:判断是否存在拥有该锁的其他线程k,它拥有的锁类型与线程t 所要申请的锁类型不相容?若是,则顺序执行步骤204,否则转到步骤205;
步骤204:进行锁等待关系迁移,即令aov[t] [k] = aov[t][j];
步骤205:清除aov[t][j]为空;
步骤206:判断aov邻接矩阵第j列中是否还有申请这把锁的下一个线程, 若是,转到步骤202,否者结束解锁过程。
这里,由于线程j释放了锁对象lm的某个类型的锁,这将导致原来被线程 j阻塞的其他线程有机会获得所申请的锁类型。对于被线程j阻塞的其他线程t, 此时存在2中可能,第一种可能是线程j拥有的锁类型与线程t正要申请的锁类 型不相容,那么这2个线程之间的等待关系保持不变;第二种可能是线程j拥有 的锁类型与线程t正要申请的锁类型相容,则线程t有才几会获得所申请的锁类型, 线程之间的等待关系可能需要改变,这取决于锁对象lm已授予别的线程的锁类 型是否与线程t正要申请的锁类型相容。假设有某个线程k拥有的锁类型与线程 t正要申请的锁类型不相容,那么线程t还是无法获得所申请的锁类型,在这种 情况下,线程之间的等待关系发生了变化线程t现在不再等待线程j,而是等 待线程k。我们要求把这种等待关系的变化反映到邻接矩阵aov中,这个过程称 为线程间等待关系迁移。线程解锁过程的任务就是要维护线程间等待关系迁移 的信息。以上线程加锁过程和解锁过程共同完成了死锁4全测信息的收集过程,它们 为死锁检测线程准备了全局的所有线程之间的等待关系信息。
如图3所示,图3为死锁^r测算法的流程示意图,其描述了利用图论aov 网络原理4企测死锁的算法。这里要说明的是,虽然aov邻接矩阵中的数据是动 态变化着的,但是我们使用aov邻接矩阵的备份数据来检测已经发生的死锁现 象还是非常准确的。这是因为对于已经进入死锁状态的线程而言,它们都处于 阻塞状态,在没有外部介入的情况下,死锁状态不可能自动解除,所以,虽然 检测死锁过程中使用的是静态数据,但是还是可以准确无误地检测到业已发生 的死锁。不过,在检测死锁期间我们不排除有新的死锁现象产生,它们需要等 到下一次死锁检测过程才能检测得到。
具体包括以下步骤
步骤301:拷贝aov的一个备份以便计算,因为没有什么歧义,所以这个备 份还称为aov;
步骤302:计算aov的入度数组,结果存放在in—degree; 步骤303:计算aov的出度数组,结果存放在out—degree; 步骤304: in—degree是否等于out—degree 如果是,4丸行步骤305;否则执行 步骤307;
步骤305: in—degree是否是O向量?如果是,表明没有出现回路,计算结束 (唯一函数出口),否则转到步骤306;
步骤306:根据预定策略,从in—degree中选取一个非O的下标k,线程k就是 要回滚事务所在的线程号。从aov中找到非O元素aov[k][j],它是一个等待事件对象指针,根据它找到所在的锁lm,找到线程k加锁信息表tli,将tli的status字段置 成-1,然后唤醒线程k。将aov[k][j]清0,跳转步骤302;
步骤307:对于所有出度不为O且入度为O的下标i,将aov[i]
清O。跳转步骤2)。这里MAX—THREADS表示最大线程数。
如图4所示,图4为用有向图描述的发生死锁现象的场景示意图。
图4的上半图描述了该系统在某一个时刻线程之间的等待关系,顶点表示 线程,若顶点ti(i-l、 2…10, i#j)存在一条到达顶点tj (j=l、 2…10, j*i) 的弧,则表示线程ti等待tj,从图中可以看到存在2个死锁回路,应用aov网络 拓朴排序方法可以检测到这2个回路。
如图4的下半图所示,死锁检测算法找到所有只有出度、没有入度的顶点, 去掉这些顶点和它们发起的弧,不断重复该过程,直到没有任何这样的顶点。 最后就剩下下半图所示的2个回路(死锁),根据预定策略,分别选定线程t5和 线程t8作为破除死锁状态的牺牲线程。这里有必要提醒的是,任何顶点都最多 只有一条由它发起的弧,这是因为任何线程申请锁失败之后就会被阻塞,没有 机会再申请其他锁而发生第二次被阻塞的情形。
如图5和图6所示,图5和图6为应用图3所述算法4金测死锁的aov邻接 矩阵状态变化图,其中图5为检测到死锁前aov邻接矩阵的状态图,图6为检 测到死锁后aov邻接矩阵的状态图。若顶点ti存在一条到达顶点tj的弧,则aov 的第i行第j列就记录一个等待事件对象指针,在图5和图6中用实心圆点表示, 没有实心圓点的单元都是空数据。为了简化表述,假设总共只有10个线程,线 程号用阿拉伯数字表示,线程ti的线程号就是i。 aov邻接矩阵的第i行记录着线 程ti等待其他线程的信息,如前所述,显然, 一行最多只有一个非空单元。aov
15邻接矩阵的第j列记录着其他线程等待线程ti的信息, 一列可以有多个非空单元,
表示多个线程在等待该线程。应用图3的算法,只需经过筒单的矩阵运算计 算入度向量和出度向量,以及向量之间的逻辑比较,就可以对aov邻接矩阵进 行化简,从而得到图6所示的矩阵状态,空心圆点所在行对应的线程就是选定 的牺牲线程。由于矩阵运算就是简单的加法运算和逻辑比较,所以性能极高。
下面结合附图7对本发明实施例所述装置进行详细说明。
如图7所示,图7为本发明实施例所述装置的结构示意图,具体可以包括 信息存储模块、死锁检测模块、每个线程中的信息记录模块和信息更新模块, 下面对各个模块分别进行详细说明。
信息存储模块,在加锁过程中,加锁线程如果需要等待其他线程,就会生 成线程间等待关系信息,这些线程间的等待关系信息就存放到信息存储模块中; 所述信息存储模块在本发明实施例中采用的是aov邻接矩阵的形式。
信息记录模块,可以包含于于线程中,当线程进行加锁时该线程称为加锁 线程;在加锁过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程 的锁类型不相容时,所述信息记录模块将加锁线程等待其他线程的等待关系信 息记录在所述信息存储模块中,然后挂起等待相关线程进行解锁。比如,在对 某个锁对象(例如,lm)加锁的过程中,如果加锁线程i要申请的锁类型与lm 已授予其他线程(任取其中一个线程j)的锁类型不相容,则加锁线程i的信息 记录模块在aov邻接矩阵的i行j列记录这个等待关系信息(aov[i][j],表示线程 i等待线程j),而在唤醒并且获得申请的锁之后清空。
信息更新模块,可以包含于于线程中,当线程进行解锁时该线程称为解锁 线程;在相关线程进行解锁过程中,判断所述信息存储模块中记录的要申请这把锁的每个线程,所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若 不相容,则保持等待关系信息不变,若相容,则进一步判断是否与至少一个其 他线程拥有的锁类型不相容,如杲是,则进行锁等待关系迁移,更新所述邻接
矩阵中的相应等待关系信息,否则仅仅清除原来的线程间等待关系信息。比如,
在"》乂 jp : A a;甘入rr4"各 i _在7 A&么A :rf rh cr-4"工____々ft ti Ac; Hi哲d rb存_ _
3肝,4王J 4^,M ^CT'""、J ^ 1111 "JT'W WV J"i4主T , ,M J a(JV ^T汰7口l亇^p J 7'J T可——
个非空位置对应的线程t,解锁程j的信息更新模块判断是否线程t正在等待的
锁是lm且线程t所要申请的锁类型与本线程还拥有的锁类型相容,若不相容, 则保持aov[t][j]不变,若相容,则查找下一个已拥有的锁类型与线程t要申请的 锁类型不相容的线程k,令aov[t][k]:aov[t][j],清除aov[t][j]为空;否则,仅仅 清空aov[t][j]为空。
需要注意的是,每个线程本身既可以包括信息记录模块,用于在该线程作 为加锁线程时记录其与其他线程间的等待关系信息到所述信息存储模块中;还 可以包括信息更新模块,用于在该线程作为解锁模块时根据需要更新所述信息 存储模块中的相应等待关系信息。本发明实施例中仅以两个线程作为示例,但
本领域技术人员应该知道,数据库管理系统中具有多个线程,自然就会产生不 止一个的线程间等待关系信息。
死锁检测模块,本发明实施例中死锁检测模块由一个后台独立线程(死锁 检测线程)定期执行(事后检测)或者在加锁过程中即时检测(事先检测)。死 锁检测线程先拷贝aov邻接矩阵(aov邻接矩阵构成一个有向图G)的一个备份, 接着应用图3所示的检测算法对备份数据进行运算,查找其中的循环等待环(死 锁回路)去掉所有没有前驱的结点以及所有它发出的弧,如果所有结点都可以 去掉,则说明没有发生死锁,结束检测;否则说明存在死锁回路,根据预定策略选取死锁回^各中的 一个结点作为死锁一全测的牺牲线程。
对于本发明实施例所述装置的具体实现过程,由于本发明实施例所述方法 中已进行了详细说明,故此处不再赘述。
综上所述,本发明实施例提供了一种数据库事务锁机制的死锁检测方法及
<formula>formula see original document page 18</formula>
利用邻接矩阵来记录线程之间的等待关系,只需对矩阵进行简单的运算就 可以检测出线程之间的所有循环等待环,对每个环,根据某个策略选定一个牺 牲线程,让其失败返回,就可以破除死锁,具有极高的检测效率。
可以充分利用加、解锁过程已获得的信息来协助;险测死锁,避免真正执行 死锁检测过程中重复计算这些信息,从而提高了系统计算资源的利用率。而目 前很多锁机制把加、解锁过程和死锁检测过程完全分开,丢失了一些有用的信 息,造成后期执行死锁检测过程的重复计算,浪费了计算资源。
利用aov邻接矩阵备份数据来检测死锁,可以使得死锁检测线程极小妨碍 正常线程的加、解锁过程,几乎不会阻塞正常线程的执行。而目前很多锁机制 因为检测死锁过程中需要访问资源图和锁实体中的数据,所以死锁检测过程不 可避免地会瞬时阻塞其他正常线程的加、解锁过程。
死锁检测阶段使用备份数据进行运算,不会干扰正常线程的加解锁过程, 从而提高了系统的整体效率。
以上所述,仅为本发明较佳的具体实施方式
,但本发明的保护范围并不局 限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易 想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护 范围应该以权利要求书的保护范围为准。
权利要求
1、一种数据库事务锁机制的死锁检测方法,其特征在于,预定义一个用于存放线程间等待关系信息的邻接矩阵,则所述方法包括步骤A加锁线程将加锁过程中生成的线程间等待关系信息记录在所述邻接矩阵中;步骤B解锁线程在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;步骤C死锁检测线程利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁。
2、 根据权利要求1所述的方法,其特征在于,所述步骤A具体包括 在对某锁对象进行加锁的过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类型不相容时,将加锁线程等待其他线程的等待关系信息 记录在所述邻接矩阵中;加锁线程挂起等待相关线程进行解锁。
3、 根据权利要求2所述的方法,其特征在于,所述步骤B具体包括 步骤B1:在相关线程进行解锁过程中,进行解锁的线程称为解锁线程;解锁线程对于所述邻接矩阵中记录的要申请解锁线程正在释放的这把锁的每个线 程,判断它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容, 执行步骤B2;若相容,则执行步骤B3; 步骤B2:保持等待关系信息不变;步骤B3:判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则 进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清除 原来的线程间等待关系信息。
4、根据权利要求1到3中任意一项所述的方法,其特征在于,所述步骤C具体包括步骤Cl:死锁检测线程拷贝所述邻接矩阵的一个备份;步骤C2:利用备份的邻接矩阵中的线程间等待关系信息及图论原理中的拓 朴排序方法对所述线程进行检测计算,检测线程间是否存在死锁回路,如果存 在,则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败 返回,乂人而-皮除死锁状态。
5、根据权利要求4所述的方法,其特征在于,所述步骤C2中的具体包括步骤C21:计算所述邻接矩阵的入度数组和出度数组,并判断入度数组是否 等于出度数组,如果是,执行步骤C22,否则执行步骤C23;步骤C22:入度数组是否是0向量,如果是,则计算结束;否则根据预定策 略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回;步骤C23:清除所有出度不为且O入度为0的元素,并转到步骤C21。
6、 一种数据库事务锁机制的死锁检测装置,其特征在于,所述装置包括 信息存储模块、死锁检测模块、每个线程中包含的信息记录模块和信息更新模 块,其中,所述信息记录模块,用于将加锁过程中生成的线程间等待关系信息记录到 所述信息存储模块中;所述信息更新模块,用于在解锁过程中根据需要更新所述邻接矩阵中的相 应等待关系信息;所述信息存储模块,用于以预定义邻接矩阵的形式保存线程间等待关系信自..所述死锁检测模块,用于根据所述信息存储模块存放的线程间等待关系信息及图论原理对线程进行^r测计算,从而判断是否存在死锁。
7、 根据权利要求6所述的装置,其特征在于,所述信息记录模块具体用于, 在加锁过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类 型不相容时,所述信息记录模块将加锁线程等待其他线程的等待关系信息记录 在所述信息存储模块中,然后挂起等待相关线程进行解锁。
8、 根据权利要求6所述的装置,其特征在于,所述信息更新模块具体用于, 在相关线程进行解锁过程中,判断所述信息存储模块中记录的要申请这把锁的 每个线程,它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相 容,则保持等待关系信息不变,若相容,则进一步判断是否与至少一个其他线 程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵 中的相应等待关系信息,否则仅清除原来的线程间等待关系信息。
9、 根据权利要求6所述的装置,其特征在于,所述死锁检测模块具体用于, 拷贝所述信息存储模块中的矩阵数据作为一个备份,利用备份的矩阵数据及图 论原理对所述线程进行检测计算,检测线程间是否存在死锁回路,当确认存在 死锁回路时,根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让 其失败返回。
全文摘要
本发明公开了一种数据库事务锁机制的死锁检测方法及装置,预定义一个用于存放线程间等待关系信息的邻接矩阵,所述方法包括加锁线程将加锁过程中生成的线程间等待关系信息记录在所述邻接矩阵中;解锁线程在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;死锁检测线程利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁;所述装置包括信息存储模块、死锁检测模块、每个线程中包含的信息记录模块和信息更新模块;本发明所提出的技术方案具有极高的死锁检测速度,而且能够充分利用加解锁过程获得的有用信息来帮助随后的检测死锁,节约了计算资源。
文档编号G06F9/46GK101576830SQ20091014396
公开日2009年11月11日 申请日期2009年6月4日 优先权日2009年6月4日
发明者卢勤元, 常二鹏, 陈河堆 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1