CN101576830B - 数据库事务锁机制的死锁检测方法及装置 - Google Patents
数据库事务锁机制的死锁检测方法及装置 Download PDFInfo
- Publication number
- CN101576830B CN101576830B CN2009101439617A CN200910143961A CN101576830B CN 101576830 B CN101576830 B CN 101576830B CN 2009101439617 A CN2009101439617 A CN 2009101439617A CN 200910143961 A CN200910143961 A CN 200910143961A CN 101576830 B CN101576830 B CN 101576830B
- Authority
- CN
- China
- Prior art keywords
- thread
- deadlock
- lock
- adjacency matrix
- information
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
- G06F9/524—Deadlock detection or avoidance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
Abstract
本发明公开了一种数据库事务锁机制的死锁检测方法及装置,预定义一个用于存放线程间等待关系信息的邻接矩阵,所述方法包括:加锁线程将加锁过程中生成的线程间等待关系信息记录在所述邻接矩阵中;解锁线程在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;死锁检测线程利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁;所述装置包括:信息存储模块、死锁检测模块、每个线程中包含的信息记录模块和信息更新模块;本发明所提出的技术方案具有极高的死锁检测速度,而且能够充分利用加解锁过程获得的有用信息来帮助随后的检测死锁,节约了计算资源。
Description
技术领域
本发明涉及数据库技术领域,尤其涉及一种数据库事务锁机制的死锁检测方法及装置。
背景技术
事务(Transaction)是数据库管理系统(DBMS)提供的基本也是最重要的功能之一,而事务功能的实现要依赖2个核心基础技术:锁机制和REDO/UNDO日志功能。锁机制是事务实现的核心技术,它关系到事务功能能否实现,系统的性能和吞吐量,以及系统的稳定性。
各种数据库管理系统所采用的锁机制的基本理论是一样的,但是实现方法各有不同。目前主流的数据库管理系统,如Oracle,Sybase,MS SQL Server,MySQL(InnoDB)等,都实现自己的一整套锁机制,各有其优缺点。
死锁检测是锁机制的一个关键技术。尽管在某些特定场景中可以使用一些方法避免和降低死锁发生,但是死锁有时还是难以避免,因此死锁检测成了锁机制中不可或缺的一部分。死锁检测需要消耗不少计算资源,其效率的好坏对系统整体性能有不小的影响。
例如,MS SQL Server 2008的死锁检测方法如下:当锁监视器对特定线程启动死锁搜索时,会标识线程正在等待的资源。然后,锁监视器查找特定资源的所有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个循环。用这种方式标识的循环形成一个死锁。这属于事后检测。
再例如,InnoDB的死锁检测也有类似的递归算法,即,事务T1(请求者线程)要对某个对象obj(表或者记录)加锁,当需要等待时,首先创建一个锁对象wait_lock,然后事先测试是否发生死锁。它调用一个自递归函数lock_deadlock_recursive(T1,wait_lock),表示判断在wait_lock之前的加锁者(事务)是否等待T1。具体死锁检测算法如下:1)如果加在对象obj上的前一个锁不存在,则没有死锁,退出。2)判断是否wait_lock需要等待前一个锁lock,且lock的拥有者T2等于T1,若是,则表示已经发生死锁,退出。3)得到事务T2正在等待的锁wait_lock2,递归调用lock_deadlock_recursive(T1,wait_lock2)。可见,InnoDB也是采用递归调用的方式来测试是否出现事务之间的等待环。
MS SQL Server和InnoDB都是采用递归方式来检测死锁,特别是InnoDB,采用双向链表来组织保护对象已授予的锁对象列表,以及事务拥有的锁对象列表,死锁检测算法遍历这些链表来检测等待环的存在。这种方式检测效率较低,而且一次检测最多只能检测出一个等待环,同时检测过程对正在进行的线程(事务)有不小的妨碍。
综上所述,目前大部分数据库管理系统,不管是事先检测还是事后检测,主要都是利用资源图(已分配资源图和请求资源图)来检测死锁。这种方法的缺点是丢失了加解锁过程中产生的有助于死锁检测的信息,使得死锁检测时需要重新计算这些信息,造成死锁检测繁琐及计算资源的浪费。
发明内容
鉴于上述的分析,本发明旨在提供一种数据库事务锁机制的死锁检测方法及装置,用以解决现有技术中存在的死锁检测繁琐及计算资源浪费的问题。
本发明的目的主要是通过以下技术方案实现的:
本发明提供了一种数据库事务锁机制的死锁检测方法,预定义一个用于存放线程间等待关系信息的邻接矩阵,则所述方法包括:
步骤A:加锁线程将加锁过程中生成的线程间等待关系信息记录在所述邻接矩阵中;
步骤B:解锁线程在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;所述步骤B具体包括:步骤B1:在相关线程进行解锁过程中,进行解锁的线程称为解锁线程;解锁线程对于所述邻接矩阵中记录的要申请解锁线程正在释放的这把锁的每个线程,判断它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容,执行步骤B2;若相容,则执行步骤B3;步骤B2:保持等待关系信息不变;步骤B3:判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清除原来的线程间等待关系信息;
步骤C:死锁检测线程利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁;所述步骤C具体包括:步骤C1:死锁检测线程拷贝所述邻接矩阵的一个备份;步骤C2:利用备份的邻接矩阵中的线程间等待关系信息及图论原理中的拓扑排序方法对所述线程进行检测计算,检测线程间是否存在死锁回路,如果存在,则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回,从而破除死锁状态。
进一步地,所述步骤A具体包括:
在对某锁对象进行加锁的过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类型不相容时,将加锁线程等待其他线程的等待关系信息记录在所述邻接矩阵中;
加锁线程挂起等待相关线程进行解锁。
进一步地,所述步骤C2中的具体包括:
步骤C21:计算所述邻接矩阵的入度数组和出度数组,并判断入度数组是否等于出度数组,如果是,执行步骤C22,否则执行步骤C23;
步骤C22:入度数组是否是0向量,如果是,则计算结束;否则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回;
步骤C23:清除所有出度不为且0入度为0的元素,并转到步骤C21。
本发明实施例还提供了一种数据库事务锁机制的死锁检测装置,所述装置包括:信息存储模块、死锁检测模块、每个线程中包含的信息记录模块和信息更新模块,其中,
所述信息存储模块,用于预定义一个用于存放线程间等待关系信息的邻接矩阵;
所述信息记录模块,用于将加锁过程中生成的线程间等待关系信息记录到所述邻接矩阵中;
所述信息更新模块,用于在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;所述信息更新模块具体用于,在相关线程进行解锁过程中,对于所述邻接矩阵中记录的要申请解锁线程正在释放的这把锁的每个线程,判断它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容,保持等待关系信息不变;若不相容,判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清除原来的线程间等待关系信息;
所述死锁检测模块,用于利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁;所述死锁检测模块具体用于,拷贝所述矩阵的一个备份,利用备份的邻接矩阵中的线程间等待关系信息及图论原理中的拓扑排序方法对所述线程进行检测计算,检测线程间是否存在死锁回路,如果存在,则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回,从而破除死锁状态。
进一步地,所述信息记录模块具体用于,在加锁过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类型不相容时,所述信息记录模块将加锁线程等待其他线程的等待关系信息记录在所述信息存储模块中,然后挂起等待相关线程进行解锁。
本发明有益效果如下:
本发明所提出的技术方案具有极高的死锁检测速度,而且能够充分利用加解锁过程获得的有用信息来帮助随后的检测死锁,节约了计算资源。
本发明的其他特征和优点将在随后的说明书中阐述,并且,部分的从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在所写的说明书、权利要求书、以及附图中所特别指出的结构来实现和获得。
附图说明
图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网络拓扑排序的方法对备份数据进行运算,查找其中的循环等待环(死锁回路):去掉所有没有前驱的结点以及所有它发出的弧,如果所有结点都可以去掉,则说明没有发生死锁,结束检测;否则说明存在死锁回路,根据预定策略(可以根据用户需要进行制定,比如最小代价策略,即选择工作量最小的线程作为牺牲线程),选取每个环中的一个结点作为死锁检测的牺牲线程。这里,死锁检测可以由一个后台独立线程(死锁检测线程)定期执行(事后检测),也可以在加锁过程中即时检测(事先检测)。
需要说明的是,我们不是机械地照搬aov网络理论,aov网络主要是用来评估工程进度图的可行性,它用顶点表示活动,用弧表示活动间的优先关系。而我们主要是借用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中,这个过程称为线程间等待关系迁移。线程解锁过程的任务就是要维护线程间等待关系迁移的信息。
以上线程加锁过程和解锁过程共同完成了死锁检测信息的收集过程,它们为死锁检测线程准备了全局的所有线程之间的等待关系信息。
如图3所示,图3为死锁检测算法的流程示意图,其描述了利用图论aov网络原理检测死锁的算法。这里要说明的是,虽然aov邻接矩阵中的数据是动态变化着的,但是我们使用aov邻接矩阵的备份数据来检测已经发生的死锁现象还是非常准确的。这是因为对于已经进入死锁状态的线程而言,它们都处于阻塞状态,在没有外部介入的情况下,死锁状态不可能自动解除,所以,虽然检测死锁过程中使用的是静态数据,但是还是可以准确无误地检测到业已发生的死锁。不过,在检测死锁期间我们不排除有新的死锁现象产生,它们需要等到下一次死锁检测过程才能检测得到。
具体包括以下步骤:
步骤301:拷贝aov的一个备份以便计算,因为没有什么歧义,所以这个备份还称为aov;
步骤302:计算aov的入度数组,结果存放在in_degree;
步骤303:计算aov的出度数组,结果存放在out_degree;
步骤304:in_degree是否等于out_degree?如果是,执行步骤305;否则执行步骤307;
步骤305:in_degree是否是0向量?如果是,表明没有出现回路,计算结束(唯一函数出口),否则转到步骤306;
步骤306:根据预定策略,从in_degree中选取一个非0的下标k,线程k就是要回滚事务所在的线程号。从aov中找到非0元素aov[k][j],它是一个等待事件对象指针,根据它找到所在的锁lm,找到线程k加锁信息表tli,将tli的status字段置成-1,然后唤醒线程k。将aov[k][j]清0,跳转步骤302;
步骤307:对于所有出度不为0且入度为0的下标i,将aov[i][0..MAX_THREADS]清0。跳转步骤2)。这里MAX_THREADS表示最大线程数。
如图4所示,图4为用有向图描述的发生死锁现象的场景示意图。
图4的上半图描述了该系统在某一个时刻线程之间的等待关系,顶点表示线程,若顶点ti(i=1、2...10,i≠j)存在一条到达顶点tj(j=1、2...10,j≠i)的弧,则表示线程ti等待tj,从图中可以看到存在2个死锁回路,应用aov网络拓扑排序方法可以检测到这2个回路。
如图4的下半图所示,死锁检测算法找到所有只有出度、没有入度的顶点,去掉这些顶点和它们发起的弧,不断重复该过程,直到没有任何这样的顶点。最后就剩下下半图所示的2个回路(死锁),根据预定策略,分别选定线程t5和线程t8作为破除死锁状态的牺牲线程。这里有必要提醒的是,任何顶点都最多只有一条由它发起的弧,这是因为任何线程申请锁失败之后就会被阻塞,没有机会再申请其他锁而发生第二次被阻塞的情形。
如图5和图6所示,图5和图6为应用图3所述算法检测死锁的aov邻接矩阵状态变化图,其中图5为检测到死锁前aov邻接矩阵的状态图,图6为检测到死锁后aov邻接矩阵的状态图。若顶点ti存在一条到达顶点tj的弧,则aov的第i行第j列就记录一个等待事件对象指针,在图5和图6中用实心圆点表示,没有实心圆点的单元都是空数据。为了简化表述,假设总共只有10个线程,线程号用阿拉伯数字表示,线程ti的线程号就是i。aov邻接矩阵的第i行记录着线程ti等待其他线程的信息,如前所述,显然,一行最多只有一个非空单元。aov邻接矩阵的第j列记录着其他线程等待线程ti的信息,一列可以有多个非空单元,表示多个线程在等待该线程。应用图3的算法,只需经过简单的矩阵运算:计算入度向量和出度向量,以及向量之间的逻辑比较,就可以对aov邻接矩阵进行化简,从而得到图6所示的矩阵状态,空心圆点所在行对应的线程就是选定的牺牲线程。由于矩阵运算就是简单的加法运算和逻辑比较,所以性能极高。
下面结合附图7对本发明实施例所述装置进行详细说明。
如图7所示,图7为本发明实施例所述装置的结构示意图,具体可以包括:信息存储模块、死锁检测模块、每个线程中的信息记录模块和信息更新模块,下面对各个模块分别进行详细说明。
信息存储模块,在加锁过程中,加锁线程如果需要等待其他线程,就会生成线程间等待关系信息,这些线程间的等待关系信息就存放到信息存储模块中;所述信息存储模块在本发明实施例中采用的是aov邻接矩阵的形式。
信息记录模块,可以包含于于线程中,当线程进行加锁时该线程称为加锁线程;在加锁过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类型不相容时,所述信息记录模块将加锁线程等待其他线程的等待关系信息记录在所述信息存储模块中,然后挂起等待相关线程进行解锁。比如,在对某个锁对象(例如,lm)加锁的过程中,如果加锁线程i要申请的锁类型与lm已授予其他线程(任取其中一个线程j)的锁类型不相容,则加锁线程i的信息记录模块在aov邻接矩阵的i行j列记录这个等待关系信息(aov[i][j],表示线程i等待线程j),而在唤醒并且获得申请的锁之后清空。
信息更新模块,可以包含于于线程中,当线程进行解锁时该线程称为解锁线程;在相关线程进行解锁过程中,判断所述信息存储模块中记录的要申请这把锁的每个线程,所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容,则保持等待关系信息不变,若相容,则进一步判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅仅清除原来的线程间等待关系信息。比如,当解锁程j在对某个锁对象lm解锁的过程中,对于aov邻接矩阵第j列中每一个非空位置对应的线程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所示的检测算法对备份数据进行运算,查找其中的循环等待环(死锁回路):去掉所有没有前驱的结点以及所有它发出的弧,如果所有结点都可以去掉,则说明没有发生死锁,结束检测;否则说明存在死锁回路,根据预定策略选取死锁回路中的一个结点作为死锁检测的牺牲线程。
对于本发明实施例所述装置的具体实现过程,由于本发明实施例所述方法中已进行了详细说明,故此处不再赘述。
综上所述,本发明实施例提供了一种数据库事务锁机制的死锁检测方法及装置,具体以下优点:
利用邻接矩阵来记录线程之间的等待关系,只需对矩阵进行简单的运算就可以检测出线程之间的所有循环等待环,对每个环,根据某个策略选定一个牺牲线程,让其失败返回,就可以破除死锁,具有极高的检测效率。
可以充分利用加、解锁过程已获得的信息来协助检测死锁,避免真正执行死锁检测过程中重复计算这些信息,从而提高了系统计算资源的利用率。而目前很多锁机制把加、解锁过程和死锁检测过程完全分开,丢失了一些有用的信息,造成后期执行死锁检测过程的重复计算,浪费了计算资源。
利用aov邻接矩阵备份数据来检测死锁,可以使得死锁检测线程极小妨碍正常线程的加、解锁过程,几乎不会阻塞正常线程的执行。而目前很多锁机制因为检测死锁过程中需要访问资源图和锁实体中的数据,所以死锁检测过程不可避免地会瞬时阻塞其他正常线程的加、解锁过程。
死锁检测阶段使用备份数据进行运算,不会干扰正常线程的加解锁过程,从而提高了系统的整体效率。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
Claims (5)
1.一种数据库事务锁机制的死锁检测方法,其特征在于,预定义一个用于存放线程间等待关系信息的邻接矩阵,则所述方法包括:
步骤A:加锁线程将加锁过程中生成的线程间等待关系信息记录在所述邻接矩阵中;
步骤B:解锁线程在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;所述步骤B具体包括:步骤B1:在相关线程进行解锁过程中,进行解锁的线程称为解锁线程;解锁线程对于所述邻接矩阵中记录的要申请解锁线程正在释放的这把锁的每个线程,判断它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容,执行步骤B2;若相容,则执行步骤B3;步骤B2:保持等待关系信息不变;步骤B3:判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清除原来的线程间等待关系信息;
步骤C:死锁检测线程利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁;所述步骤C具体包括:步骤C1:死锁检测线程拷贝所述邻接矩阵的一个备份;步骤C2:利用备份的邻接矩阵中的线程间等待关系信息及图论原理中的拓扑排序方法对所述线程进行检测计算,检测线程间是否存在死锁回路,如果存在,则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回,从而破除死锁状态。
2.根据权利要求1所述的方法,其特征在于,所述步骤A具体包括:
在对某锁对象进行加锁的过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类型不相容时,将加锁线程等待其他线程的等待关系信息记录在所述邻接矩阵中;
加锁线程挂起等待相关线程进行解锁。
3.根据权利要求1所述的方法,其特征在于,所述步骤C2中的具体包括:
步骤C21:计算所述邻接矩阵的入度数组和出度数组,并判断入度数组是否等于出度数组,如果是,执行步骤C22,否则执行步骤C23;
步骤C22:入度数组是否是0向量,如果是,则计算结束;否则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回;
步骤C23:清除所有出度不为且0入度为0的元素,并转到步骤C21。
4.一种数据库事务锁机制的死锁检测装置,其特征在于,所述装置包括:信息存储模块、死锁检测模块、每个线程中包含的信息记录模块和信息更新模块,其中,
所述信息存储模块,用于预定义一个用于存放线程间等待关系信息的邻接矩阵;
所述信息记录模块,用于将加锁过程中生成的线程间等待关系信息记录到所述邻接矩阵中;
所述信息更新模块,用于在解锁过程中根据需要更新所述邻接矩阵中的相应等待关系信息;所述信息更新模块具体用于,在相关线程进行解锁过程中,对于所述邻接矩阵中记录的要申请解锁线程正在释放的这把锁的每个线程,判断它所要申请的锁类型是否与该解锁线程拥有的锁类型相容,若不相容,保持等待关系信息不变;若不相容,判断是否与至少一个其他线程拥有的锁类型不相容,如果是,则进行锁等待关系迁移,更新所述邻接矩阵中的相应等待关系信息,否则仅清除原来的线程间等待关系信息;
所述死锁检测模块,用于利用所述邻接矩阵及图论原理对所述线程进行检测计算,从而判断是否存在死锁;所述死锁检测模块具体用于,拷贝所述矩阵的一个备份,利用备份的邻接矩阵中的线程间等待关系信息及图论原理中的拓扑排序方法对所述线程进行检测计算,检测线程间是否存在死锁回路,如果存在,则根据预定策略在所述死锁回路中选择一个线程作为牺牲线程,让其失败返回,从而破除死锁状态。
5.根据权利要求4所述的装置,其特征在于,所述信息记录模块具体用于,在加锁过程中,当加锁线程要申请的锁类型与该锁对象已授予其他线程的锁类型不相容时,所述信息记录模块将加锁线程等待其他线程的等待关系信息记录在所述信息存储模块中,然后挂起等待相关线程进行解锁。
Priority Applications (4)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101439617A CN101576830B (zh) | 2009-06-04 | 2009-06-04 | 数据库事务锁机制的死锁检测方法及装置 |
PCT/CN2010/073392 WO2010139260A1 (zh) | 2009-06-04 | 2010-05-31 | 数据库事务锁机制的死锁检测方法及装置 |
EP10782964.0A EP2439640A4 (en) | 2009-06-04 | 2010-05-31 | METHOD AND DEVICE FOR DETECTING FATAL STOP OF DATA BASE TRANSACTION LOCKING MECHANISM |
BRPI1011087A BRPI1011087A2 (pt) | 2009-06-04 | 2010-05-31 | método e dispositivo para detecção de bloqueio de mecanismo de trava de transação de banco de dados. |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2009101439617A CN101576830B (zh) | 2009-06-04 | 2009-06-04 | 数据库事务锁机制的死锁检测方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101576830A CN101576830A (zh) | 2009-11-11 |
CN101576830B true CN101576830B (zh) | 2011-11-30 |
Family
ID=41271767
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2009101439617A Active CN101576830B (zh) | 2009-06-04 | 2009-06-04 | 数据库事务锁机制的死锁检测方法及装置 |
Country Status (4)
Country | Link |
---|---|
EP (1) | EP2439640A4 (zh) |
CN (1) | CN101576830B (zh) |
BR (1) | BRPI1011087A2 (zh) |
WO (1) | WO2010139260A1 (zh) |
Families Citing this family (22)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101576830B (zh) * | 2009-06-04 | 2011-11-30 | 中兴通讯股份有限公司 | 数据库事务锁机制的死锁检测方法及装置 |
CN102222015B (zh) * | 2010-04-13 | 2016-04-27 | 三星电子(中国)研发中心 | 检测多线程程序中的死锁的方法及系统 |
CN102156928A (zh) * | 2011-04-29 | 2011-08-17 | 浪潮通信信息系统有限公司 | 一种通过业务逻辑锁进行系统并发控制的方法 |
CN102521033B (zh) * | 2011-12-14 | 2014-06-25 | 华南理工大学 | 一种监测系统调度的死锁检测与解除方法 |
CN105468508B (zh) * | 2014-09-04 | 2018-07-03 | 阿里巴巴集团控股有限公司 | 代码检测方法及装置 |
CN105468509A (zh) * | 2014-09-04 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 代码稳定性检测方法及装置 |
WO2016160416A1 (en) | 2015-04-01 | 2016-10-06 | Ab Inito Technology Llc | Processing database transactions in a distributed computing system |
CN106959895B (zh) * | 2016-01-12 | 2021-01-01 | 创新先进技术有限公司 | 快速释放线程的资源调度方法和系统 |
CN107305507B (zh) * | 2016-04-25 | 2020-05-01 | 北京京东尚科信息技术有限公司 | 死锁控制方法和装置 |
EP3557459B1 (en) * | 2018-04-17 | 2022-05-25 | Panasonic Intellectual Property Corporation of America | Method, information processing device, management system, and program to control locking and unlocking of storage |
CN109669858B (zh) * | 2018-11-22 | 2022-04-12 | 新华三技术有限公司合肥分公司 | 程序死锁的测试方法、装置和设备 |
CN111221658B (zh) * | 2019-05-31 | 2023-08-01 | 烟台职业学院 | 系统死锁的检测方法及系统 |
CN112256442A (zh) * | 2019-07-22 | 2021-01-22 | 中兴通讯股份有限公司 | 一种数据库死锁检测方法及装置 |
CN110909012B (zh) * | 2019-12-04 | 2020-09-04 | 上海达梦数据库有限公司 | 数据库对象的封锁方法、装置、设备和存储介质 |
CN111522730B (zh) * | 2020-03-09 | 2024-03-29 | 平安科技(深圳)有限公司 | 程序测试方法及装置、计算机装置、计算机可读介质 |
CN111752718B (zh) * | 2020-05-28 | 2022-07-12 | 西安深信科创信息技术有限公司 | 一种低开销的死锁预测方法、装置及电子设备 |
CN112099960A (zh) * | 2020-09-21 | 2020-12-18 | 天津神舟通用数据技术有限公司 | 一种基于路径推进的分布式死锁检测方法 |
CN112100192A (zh) * | 2020-09-27 | 2020-12-18 | 中国建设银行股份有限公司 | 数据库锁等待处理方法及装置 |
CN112363846B (zh) * | 2021-01-11 | 2021-04-13 | 北京金山云网络技术有限公司 | 数据库事务的死锁检测方法、装置及电子设备 |
CN113742091A (zh) * | 2021-08-31 | 2021-12-03 | 深圳Tcl新技术有限公司 | 一种线程运行方法、装置、计算机设备和存储介质 |
CN117667430A (zh) * | 2022-08-31 | 2024-03-08 | 华为技术有限公司 | 持锁进程检测方法及相关设备 |
CN116089100B (zh) * | 2023-01-12 | 2023-10-20 | 北京万里开源软件有限公司 | 一种数据库中锁资源监控方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6128706A (en) * | 1998-02-03 | 2000-10-03 | Institute For The Development Of Emerging Architectures, L.L.C. | Apparatus and method for a load bias--load with intent to semaphore |
CN1622526A (zh) * | 2003-11-26 | 2005-06-01 | 华为技术有限公司 | 一种数据传输死锁的解决方法 |
EP1569121B1 (en) * | 2004-02-26 | 2007-07-11 | Research In Motion Limited | Method and system for detecting potential deadlocks in computer programs |
CN101295266A (zh) * | 2008-06-05 | 2008-10-29 | 华为技术有限公司 | 检测和解除死锁的方法、装置和系统 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2027934C (en) * | 1989-12-22 | 1994-06-21 | Cherie C. Barnes | Accelerated deadlock detection in congested data transactions |
US20070150897A1 (en) * | 2005-12-22 | 2007-06-28 | International Business Machines Corporation | Methods and apparatus for detecting deadlock in multithreading programs |
CN101576830B (zh) * | 2009-06-04 | 2011-11-30 | 中兴通讯股份有限公司 | 数据库事务锁机制的死锁检测方法及装置 |
-
2009
- 2009-06-04 CN CN2009101439617A patent/CN101576830B/zh active Active
-
2010
- 2010-05-31 EP EP10782964.0A patent/EP2439640A4/en not_active Withdrawn
- 2010-05-31 BR BRPI1011087A patent/BRPI1011087A2/pt not_active Application Discontinuation
- 2010-05-31 WO PCT/CN2010/073392 patent/WO2010139260A1/zh active Application Filing
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6128706A (en) * | 1998-02-03 | 2000-10-03 | Institute For The Development Of Emerging Architectures, L.L.C. | Apparatus and method for a load bias--load with intent to semaphore |
CN1622526A (zh) * | 2003-11-26 | 2005-06-01 | 华为技术有限公司 | 一种数据传输死锁的解决方法 |
EP1569121B1 (en) * | 2004-02-26 | 2007-07-11 | Research In Motion Limited | Method and system for detecting potential deadlocks in computer programs |
CN101295266A (zh) * | 2008-06-05 | 2008-10-29 | 华为技术有限公司 | 检测和解除死锁的方法、装置和系统 |
Non-Patent Citations (4)
Title |
---|
Chim-fu Yeung |
Chim-fu Yeung;Sheung-lun Hung.《new deadlock detection algorithms for distributed real-time database systems》.《Reliable Distributed Systems,1995. Proceedings., 14th Symposium on》.1995,146. * |
Sheung-lun Hung.《new deadlock detection algorithms for distributed real-time database systems》.《Reliable Distributed Systems,1995. Proceedings., 14th Symposium on》.1995,146. |
陈鹏.《分布式数据库死锁检测算法研究》.《中国优秀硕士学位论文数据库》.2004, * |
Also Published As
Publication number | Publication date |
---|---|
EP2439640A4 (en) | 2015-01-21 |
WO2010139260A1 (zh) | 2010-12-09 |
CN101576830A (zh) | 2009-11-11 |
EP2439640A1 (en) | 2012-04-11 |
BRPI1011087A2 (pt) | 2018-05-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101576830B (zh) | 数据库事务锁机制的死锁检测方法及装置 | |
US10496627B2 (en) | Consistent ring namespaces facilitating data storage and organization in network infrastructures | |
CN109739935B (zh) | 数据读取方法、装置、电子设备以及存储介质 | |
CN107148617B (zh) | 日志协调存储组的自动配置 | |
JP7389793B2 (ja) | 分散型異種ストレージシステムにおけるデータ一貫性のリアルタイムチェックのための方法、デバイス、およびシステム | |
CN104793988A (zh) | 跨数据库分布式事务的实现方法和装置 | |
CN106462449A (zh) | 具有多项目事务支持的多数据库日志 | |
CN111444027B (zh) | 事务处理方法、装置、计算机设备及存储介质 | |
CN112039970B (zh) | 一种分布式业务锁服务方法、服务端、系统及存储介质 | |
CN109783578B (zh) | 数据读取方法、装置、电子设备以及存储介质 | |
Padhye et al. | Scalable transaction management with snapshot isolation for NoSQL data storage systems | |
CN111127252A (zh) | 一种水资源管理决策支持系统的数据管理方法 | |
CN102609313B (zh) | 多核系统资源延迟回收锁的实现方法及系统 | |
CN110121694B (zh) | 一种日志管理方法、服务器和数据库系统 | |
CN114385755A (zh) | 一种分布式存储系统 | |
CN110659303A (zh) | 一种数据库节点的读写控制方法及装置 | |
Yang et al. | Scalable time-range k-core query on temporal graphs (full version) | |
CN116089359A (zh) | 数据库快照的生成方法、装置、电子设备和介质 | |
CN114880717A (zh) | 数据归档方法及装置 | |
JPH0277868A (ja) | 共用データの管理方法 | |
CN113297173A (zh) | 分布式数据库集群管理方法及装置、电子设备 | |
Alonso et al. | Partitioned data objects in distributed databases | |
Maiyya et al. | Samya: A geo-distributed data system for high contention aggregate data | |
CN110619207B (zh) | 特权账号分布式存储方法及装置 | |
JP4604032B2 (ja) | 非共有データベースシステムにおける1段階コミット |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right | ||
TR01 | Transfer of patent right |
Effective date of registration: 20170517 Address after: 518053 Guangdong city of Shenzhen province Nanshan District Tonggu Lu Da Chong business center C block 1007 Patentee after: Fu Jing Technology (Shenzhen) Co., Ltd. Address before: 518057 Nanshan District Guangdong high tech Industrial Park, South Road, science and technology, ZTE building, Ministry of Justice Patentee before: ZTE Corporation |