CN111597193A - 一种树形数据的加解锁方法 - Google Patents
一种树形数据的加解锁方法 Download PDFInfo
- Publication number
- CN111597193A CN111597193A CN202010347309.3A CN202010347309A CN111597193A CN 111597193 A CN111597193 A CN 111597193A CN 202010347309 A CN202010347309 A CN 202010347309A CN 111597193 A CN111597193 A CN 111597193A
- Authority
- CN
- China
- Prior art keywords
- node
- tree
- locking
- map
- subtree
- 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.)
- Granted
Links
Images
Classifications
-
- 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
- G06F16/2343—Locking methods, e.g. distributed locking or locking implementation details
-
- 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/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- 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/2365—Ensuring data consistency and integrity
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Software Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种树形数据的加锁方法,首先提取欲加锁的子树组的标识树并计算出局部标识Map,然后对局部标识Map中的每个节点的加锁标记计数值,取同一节点在整棵树的全局标识Map中的加锁标记计数值进行对比,以判断此次加锁是否允许,若允许加锁,将局部标识Map叠加到全局标识Map中,并保存局部标识Map,加锁成功;若不允许加锁,则按失败策略等待重试或放弃。同时本发明还公开了对应的解锁方法,将对子树组加锁时保存的局部标识Map从全局标识Map中去掉即完成解锁。通过本发明能够确保数据一致性,简化业务逻辑,增进数据并发处理能力,提升系统性能。
Description
技术领域
本发明涉及数据处理技术领域,尤其涉及一种树形数据的加解锁方法。
背景技术
随着互联网时代的发展,业务的复杂度越来越高,IT系统倾向于组件化、模块化、微服务化,即是对业务拆分成相对独立的底层组件,再在高层加以综合而形成整体业务。体现在业务的数据上,就是业务的一个实例的数据保存为一个树形结构,每个底层业务组件对应的数据是树中的一棵子树,并且这种拆分-组合的关系可以嵌套。
在业务处理过程中,有的业务场景只涉及单个底层组件,这样业务的数据改变只会涉及该组件对应的子树,而不影响树中的其他数据。如果在同一个业务实例中,两个业务场景涉及两个不同组件,它们修改的数据是同一棵树上的两个不同子树,那么它们就可以同时执行。相反,如果两个业务涉及到相同的组件,它们就很可能修改同一组数据,而不能同时执行。如果它们同时执行,就很可能造成数据被覆盖、数据完整性破坏等访问冲突,在这种情况下,就需要对业务将要访问的数据进行加锁,以保证业务逻辑和数据的正确。
例如,某个业务由组件X和Y组成,而整个业务的数据结构如附图1所示。其中组件X的数据对应于B1子树,而组件Y的数据对应于B2子树。如果一个业务只涉及到X组件,那么它就只需要修改B1子树的数据,而不需要修改B2子树的数据。涉及Y组件的业务同理。这样,一个只涉及X组件的业务与另一个只涉及Y组件的业务就可以同时执行,而两个涉及X组件的业务就不能同时执行,或者一个涉及X组件的业务与另一个同时涉及X和Y组件的业务也不能同时执行。这样就可以实现访问数据有重叠的业务互斥,访问数据无重叠的业务不互斥的效果。
在并发访问和处理树结构时,通常需要采用加锁的方式避免发生冲突和保证数据一致性,现有技术有两种:
1.对整棵树进行加锁,即每棵树对应一个锁,在业务访问一棵树前,需要先对该树对应的锁进行加锁,处理完该请求后对该锁进行解锁,其他业务才能获取该锁,从而访问这棵树。在这种加锁方式中,一棵树同时只能被一个业务访问,即使是无关的业务也无法同时处理,对并发性能影响很大。例如:两个业务各自需要访问同一棵树的D2和E5节点。为了确保数据的正确性,需要对访问的数据加锁,但在对整棵树加锁的方式中,两个业务都需要获取到整棵树的锁后才能处理数据,从而只能依次执行,而不能同时执行。可见,该方式需要对整棵树加锁,一棵树同时只能有一个业务处理,即使是多个业务处理的数据不同也是如此,在业务高并发时会极大的影响性能,无法满足业务的需要。
2.对业务需要修改的每一个数据节点都加锁。一棵树中每个数据节点都对应一个锁,业务处理前需要对自己本次处理的所有数据节点都获取到锁,才能开始处理。例如:一个业务需要访问一棵树的D2子树,它就必须对D2、E1、E2、E3、F1、F2等6个节点加锁后才能开始处理。其他涉及这几个节点的业务必须等该节点处理完成后释放锁才能开始,而不涉及这些节点的业务可以与该业务同时执行。这种方式可以避免第1种方式无法并发的问题,但要求业务对树中每个节点的数据访问进行细致的控制,增加了业务复杂度。此外还要求业务预先知道自己将要处理哪些节点,而这在某些场景下是不可能的。如果遗漏了对必要节点的锁定,而有其他业务同步修改数据,会造成业务错误。
发明内容
本发明的目的是为了克服现有技术的缺陷,提供一种树形数据的加解锁方法,尤其是一种对树形数据的多个子树作为整体进行加解锁的方法,通过本发明能够确保数据的一致性,简化业务逻辑,增进数据并发处理能力,提升系统性能。
为实现上述目的,本发明提供一种树形数据的加锁方法,特别是一种对树形数据的多个子树作为整体进行加锁的方法,该方法包括以下步骤:
a.提取子树组去重、去包含后的标识树;
b.提取出该标识树的局部标识Map;
c.获取整棵树的全局Lock;
d.校验标识,对步骤b得到的局部标识Map中的每个元素,取其对应节点在整棵树的全局标识Map中的加锁标记计数值进行对比,以判断此次加锁是否允许;若允许加锁,则转到步骤e;若不允许加锁,则转到步骤f;
e.将局部标识Map叠加到全局标识Map中,并保存局部标识Map,加锁成功,释放整棵树的全局Lock,处理结束;
f.释放整棵树的全局Lock,加锁失败,按失败策略等待重试或放弃。
进一步地,提取子树组的标识树的方法,对将要加锁的子树组中一个子树的根节点,向上找它的父节点,对找到的父节点继续向上找父节点,直到整棵树的根节点,就得到从一个子树根节点到整棵树的根节点的路径;如果在路径上存在子树组中另一个子树的根节点,则丢弃该节点路径;剩下的所有节点路径中节点的并集就是这个子数组的标识树。
进一步地,构造标识Map的方法为:标识Map的键是节点id,值是节点标识数据;节点标识数据是一个四元组,包括:本节点读锁计数,本节点写锁计数,子节点读锁计数,子节点写锁计数。为整棵树和每个加锁的子树组各分配一个标识Map。
进一步地,简化标识Map的方法为:当一个节点的标识数据全为0的时候,该节点不放入标识Map中,只有当节点的标识数据至少有一个非0,才放入标识Map。
进一步地,标识树的局部标识Map的提取方法为:
首先,构造一个空的标识Map;然后,对于找到的标识树的每个叶子节点,向Map中加入以下项目:
如果是加读锁:<节点id>-->(1,0,0,0),
如果是加写锁:<节点id>-->(0,0,1,0),
然后,对于找到的标识树的每个非叶子节点,向Map中加入以下项目:
如果是加读锁:<节点id>-->(0,1,0,0),
如果是加写锁:<节点id>-->(0,0,0,1)。
进一步地,对局部标识Map中的每个元素LE的加锁标记计数值LEV,取其对应节点在全局标识Map中的加锁标记计数值GEV进行对比,以判断此次加锁是否允许。对单个元素对比的方法如下:
1)如果全局标识Map中不包含同一节点的元素,则当前元素检查通过;
2)如果全局标识Map中包含同一节点的元素GE,则对LE和GE的加锁标记计数值LEV和GEV做以下检查:
i.如果LEV的“本节点读锁计数”不为0,那么GEV的“本节点写锁计数”、“子节点写锁计数”都必须为0;
ii.如果LEV的“本节点读锁计数”不为0,那么GEV的“本节点写锁计数”、“子节点写锁计数”都必须为0;
iii.如果LEV的“子节点读锁计数”不为0,那么GEV的“本节点写锁计数”必须为0;
iv.如果LEV的“本节点写锁计数”不为0,那么GEV的“本节点读锁计数”、“子节点读锁计数”、“本节点写锁计数”、“子节点写锁计数”都必须为0;
v.如果LEV的“子节点写锁计数”不为0,那么GEV的“本节点读锁计数”、“本节点写锁计数”都必须为0;
所有4个检查都通过,则当前元素检查通过。如果4个检查中任何一个检查不通过,则当前元素检查不通过。
进一步地,如果局部标识Map中所有元素都检查通过,那么此次加锁操作被允许;如果任一个元素检查不通过,那么此次加锁操作不允许执行。
进一步地,当对子树组的加锁操作允许时,将子树组的局部标识Map叠加到整棵树的全局标识Map中,其方法为:
对局部标识Map中的每个元素LE,在全局标识Map中查找键相同的元素;
i.如果没有找到,那么把元素LE直接加入到全局标识Map中;
ii.如果在全局标识Map中找到元素GE,那么将LE的值中每个计数的值加到GE的值中对应计数的值上;
iii.保存本次加锁操作的局部标识Map,以备解锁时使用。
进一步地,如果加锁不区分读写场景,则等同于加写锁。
为实现上述目的,本发明还提供一种树形数据的解锁方法,该方法与加锁方法相对应,对树形数据的多个子树作为整体进行解锁,包括以下步骤:
a.获取之前对子树组加锁时生成的局部标识Map;
b.获取整棵树的全局Lock;
c.将之前加锁时叠加到全局标识Map上的局部标识Map从全局标识Map中去掉;
d.释放整棵树的全局Lock,解锁完成。
进一步地,将之前加锁时叠加到全局标识Map上的局部标识Map从全局标识Map中去掉,具体做法是:对局部标识Map中的每个元素LE,在全局标识Map中找到键相同的元素GE后,将LE的值包含的4个计数值从GE的值包含的对应计数值中减去。减去后如果GE的值包含的4个计数值全为0,则将GE从全局标识Map中移除。
本发明技术方案带来的有益效果:
本发明提供的一种树形数据的加解锁方法,通过对子树组的标识树中所有节点进行标记,实现加解锁操作。与现有的常规做法相比较,本发明的优势是:
1.通常来说,一个子树组的标识树中的节点数要比子树组中的节点数少得多,本方法对标识树操作而非对子树组中的节点操作,从而减少了需要操作的节点数量,提高了性能。
2.控制加锁粒度为子树组,在确保数据一致性的同时,精准锁定区域范围,避免锁定无关区域;以及区分读写场景,允许多个业务同时读取相同数据,可以有效减少并发业务锁定数据时发生锁冲突和等待的概率。
3.对多个子树的原子性加解锁操作,及加锁冲突时的策略,使业务免于承担部分加锁成功部分失败的处理,简化了业务逻辑。
4.通过分析子树锁原理,设计出对子树组的标识树中每个节点标记的方法,以及标记的数据结构,通过Map查找节点标识,通过简单的算术运算实现加解锁标记,具备良好的性能。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1是本发明的树形数据结构的一个示例图;
图2是本发明的树形数据结构加锁后标记形态的一个示例图;
图3是本发明的加锁流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
一、名词定义
为便于本发明中技术方案的理解,本发明中用到的名词定义如下:
·子树组:在对一棵树的多个子树作为一个整体进行加解锁时,这些子树的集合叫做子树组。
·标识树:子树组中所有子树根节点到整棵树根节点的路径中所有节点的并集就是这个子树组的标识树。
·标识Map:记录一棵标识树中节点的已加锁标识的Map,它的键是标识树的节点id,值是节点的计数四元组。
·LMM:局部标识Map,为Local Mark Map的缩写,含义为子树组的标识Map。
·GMM:全局标识Map,为Global Mark Map的缩写,含义为整棵树的标识Map。
·计数四元组:用来标识一个节点的加锁情况的四个数字,依次为:本节点读锁计数、本节点写锁计数、子节点读锁计数、子节点写锁计数,记作用括号包围的4个有序整数,形如:(0,2,1,0)。
·LE:局部标识元素,为Local Element的缩写,含义为表示一个节点在LMM中加锁情况的键值对,其中键是节点id,值是LEV。
·GE:全局标识元素,为Global Element的缩写,含义为一个节点在GMM中加锁情况的键值对,其中键是节点id,值是GEV。
·LEV:局部标识计数值,为Local Element Values的缩写,含义为表示一个节点在LMM中加锁情况的计数四元组。
·GEV:全局标识计数值,为Global Element Values的缩写,含义为一个节点在GMM中加锁情况的计数四元组。
二、发明目的
在由多个底层组件组合而成的业务中,业务的数据实例通常是树形结构,其子树由多个底层组件对应数据组成,例如:XML数据、Json数据等等。而高并发是现代IT系统发展的趋势,如果一个树形数据只能同时支持一个业务访问,那么将会造成业务瓶颈。然而,树形数据天然地可以按每个节点下挂的子树划分成多个区域,如果一个业务对树形数据的操作只涉及一个或一些子树的区域,那么对同一树形数据的无交集子树区域操作的业务应该可以同时进行,从而允许多个业务对同一个树形数据实例的不同部分进行同时处理,提高并发度。而避免多业务并发处理同一个树形数据实例的相同部分也是必须的,否则会造成数据访问冲突、业务出错。因此,可以对树形数据施加一种访问控制即加锁机制,其粒度为子树级,锁定范围为多个子树区域,一个业务在对一棵树形数据实例中的子树区域访问前,需要先对该区域加锁,如果加锁成功,说明该业务能够访问它锁定的子树区域,而不必担心其他业务的干扰;如果加锁失败,说明它将要访问的子树区域被其他业务锁定,该业务必须等待其他业务处理结束后才能加锁并访问数据。
本发明的目的是:提供一种数据的加解锁方法,对一个树形数据中的一组子树,分读写场景进行原子性加锁和解锁,并支持超时设置。加锁的效果是:对一组子树加锁后,不仅能阻止后续对该子树的其他加锁请求,还能阻止对其他相关子树的加锁请求,而不会影响对无关子树的加锁。
本发明能够对一个树形数据中的一组子树进行原子性加解锁,每次操作的子树数量没有限制,因此,对一个子树加锁,实际上是对n个子树加锁的n=1的特殊情形,因此下文统一阐述对多个子树加解锁的方法,对一个子树加解锁的方法可通过令该方法只对一个子树操作而从中自然导出,而无需另外说明。
三、应用场景
对于同时涉及多个底层模块的业务,访问的数据也位于树的多个子树上。例如,一个业务需要同时对子树C1和D2的数据进行处理。在没有本发明提供的原子性加锁方法的情况下,有两种方法处理这种情形,但都存在问题:
1.对整棵树加锁。这样的问题是会扩大加锁的范围,阻止与本业务访问数据的子树区域不相交的其他业务同时运行,降低并发度。
2.对包含所有欲访问子树的公共子树加锁,例如,对包含子树C1和D2的最小公共子树B1加锁。但这样做同样会扩大加锁的范围,例如会对与此业务无关的子树D3也锁定,存在与对整棵树加锁同样性质的问题。
3.由业务对将要锁定的子树区域中的每个节点加锁。这样做的问题是:
a)性能低下,子树中的节点数量通常比子树本身的数量大得多;
b)对多个节点加锁非原子操作,可能有多个业务同时加锁,造成互相干扰,出现死锁。
4.业务自身对各个子树依次加锁,通过对子树的根节点加锁来代表对子树的加锁。例如,由业务自身首先对子树C1的根节点C1加锁,成功后业务再对子树D2的根节点D2加锁。但这样没有原子性保证,可能导致业务对一部分子树加锁成功,但另一部分子树因为被其他业务锁定而加锁失败,业务为避免死锁,需要正确处理这种部分锁定的情形,增加了复杂性。另外,如果两个业务处理的子树区域,不是子树恰好重叠,而是子树相互包含的情形,则难以在加锁时判断,从而无法阻止存在数据访问冲突的业务成功加锁。
本发明提供原子性的子树组加锁方法,对子树组中的多个子树作为一个整体进行加锁,要么全部子树加锁成功,要么全部子树加锁失败,不存在部分成功部分失败的情形,避免业务对此情形处理的负担;并能够判断子树相互包含的情形,从而在各种场景下避免发生数据访问冲突、数据处理出错,保证业务逻辑在并发场景下的正确性。
5.功能特性
1)读锁和写锁
本发明的目的之一是对子树组加锁,锁的类型包括读锁和写锁。读锁表示业务对锁对应的子树组数据只进行读取,不进行写入;写锁表示业务需要对该子树组数据进行写入(包括在树中增加新节点、修改已有的节点的数据、删除已有的节点)。
本发明也支持不区分读写场景的锁,对这种锁的处理等同于写锁。
2)加锁的超时设置
本发明支持对子树组加锁时设置超时时间。当一个业务对一个子树组加锁的时候,如果这个子树组已经被其他业务锁定,并且锁的类型不兼容,那么业务可以选择处理方式:是立即返回加锁失败的结果,还是过一小段时间后自动重试加锁。在后者的情况下,可以设置总的尝试时间,当这个尝试时间已过去,仍然无法通过重试成功加锁,才返回加锁失败的结果。这个重试加锁的总尝试时间就是加锁时指定的超时时间。
3)原子性加锁
本发明支持对子树组,也就是一棵树上的多个子树一次性加锁,并提供原子性保证,即对加锁的业务来说,当加锁操作结束后,这些子树要么全部加锁成功,要么全部加锁失败,而不存在部分成功部分失败的情形。
6.基本概念
1)子树组
把一次加锁对应的多个子树叫做一个子树组。注意子树组中的子树个数可以为1,因此子树组同时包含了一个子树和多个子树的情形。
由于在一棵树中,一个子树与该子树的根节点是一一对应的,所以可以用一棵子树的根节点来表示该子树,例如:子树A1。而子树组则可记为该子树组中所有根节点的集合,例如{B1,C4}。为方便引用,子树组也可以直接赋予名称,例如子树组X={B1,C4}。
注意在一个子树组中的子树之间,是有可能互相重叠或包含的,也就是一个子树组中的一个子树可以与另一个子树相同,或者一个子树可以是另一个子树的子树。例如:在图1的树中的一个子树组{D2,D2,E2},有两个以D2为根的相同子树,同时E2也是D2的子树。但在本发明的领域中,对这样的子树组加锁,也就是原子性地对其中的所有子树加锁,相同的子树只需要加锁一次,而对上层子树加的锁,其作用范围总是覆盖下层子树的,因此只需要对上层子树加锁和解锁,而可以忽略对下层子树的加锁和解锁。也就是说,对于这种有相互重叠或包含的子树的子树组,可以去掉重复子树或被包含的下层子树,得到另一个子树组,而在加解锁的功能性上与原先的子树组没有任何区别。一棵树中的两个子树是很容易判定是否互相重叠或包含,并在重叠时去重或在包含时排除下层子树的,因此在本发明中,把对子树组中的子树去重与去除被包含子树作为第一个步骤,从而将问题简化为对没有子树相互重叠或包含的子树组加解锁。因此在下文的概念及原理分析中提及的子树组,都排除掉其中有相互重叠或包含的子树的情形,而只讨论其中所有子树都没有交集的情形,而得到的方法同样适用于有子树相互重叠或包含的子树组。
需要说明的是,上述的去重、去包含是针对同一子树组中的子树。不同子树组之间的子树重叠或互相包含,是允许的情形,不会影响本方法的正确性。
2)相关子树与无关子树,子树的相关性
给定一棵树T中的一个子树A,A的相关子树是指T中所有与A有交集的子树。
T中一个子树A的相关子树是一个集合,其中包括:
a)该子树A本身;
b)包含该子树A的子树;
c)该子树A包含的子树。
而子树A的无关子树则表示T中与A没有交集的其他子树。
例如,在图1的树中,对D2子树来说,D2子树、E2子树、C2子树都是它的相关子树;而C1子树、B2子树都是它的无关子树。
相关子树关系是对称的,即是:在一棵树中,如果子树A是子树B的相关子树,那么子树B也是子树A的相关子树。
如果子树A是子树B的相关子树,那么称为子树A与B相关。反之则称为A与B无关。
3)子树组的相关性
如果一个子树组的至少一个相关子树包含在另一个子树组中,那么称为这两个子树组相关。反之,如果一个子树组的所有相关子树都不属于另一个子树组,那么称为这两个子树组无关。
4)子树组的标识树
对于一棵树中的一个去重、去包含后的子树组来说,子树组中每个子树的根节点到整棵树的根节点的路径的集合也组成一棵树。把这棵树叫做这个子树组的标识树。例如,在图1中以C2、D5为根节点的2个子树组成的子树组,其标识树就是节点集合{A1,B1,C2,B2,C4,D5}。
显然,一个子树组的标识树的叶子节点就是子树组中所有子树的根节点。
5)读写锁的兼容性
读锁表示业务对锁对应的子树组数据只进行读取,不进行写入,其他读取相关子树组数据的业务可以并行执行,因此对于已加读锁的子树组,其相关子树组可以加读锁,也就是读锁兼容读锁;写锁表示业务需要对该子树组数据进行写入,在写入过程中,子树组的数据会存在不一致的可能,其他业务如果同时读取相关子树组的数据,可能会读到本子树组正在写入从而不一致的数据,因此不能对相关子树组加读锁,也就是写锁排斥读锁;其他业务如果对相关子树组写入数据,可能会与本业务的写入数据相互干扰,因此不能加写锁,也就是写锁排斥写锁。也就是说:子树组的读锁兼容相关子树的读锁,但排斥相关子树组的写锁;子树组的写锁排斥相关子树组的读锁和写锁。
总结子树读写锁的规则如下:
表1
对于两个子树组A和B而言,以A为基准,是否允许对B加锁,就是看B中包含的所有子树,是否与A无关,或者在待加锁的类型上是否与A已有的锁类型兼容。
如果子树组B中包含的所有子树都满足:或者与子树组A无关,或者与子树组A相关但待加锁的类型与子树组A的锁类型兼容,那么子树组B就允许加锁。反之,如果子树组B中存在子树,与子树组A相关,并且待加锁的类型被子树组A的锁类型排斥,那么子树组B就不允许加锁。
对于不区分读写场景的锁类型,业务获取到该类型的锁后能访问对应数据,既能读取,又能写入,因此与写锁相当,在本发明中与写锁同等对待。
7.子树锁的原理
1)对子树组加锁的目的是阻止对相关子树组加不兼容的锁
本发明的对子树组的加锁机制的作用是:允许多个业务同时访问一棵树中的不同子树区域中的节点或以兼容的方式访问同一子树区域中的节点,而阻止多个业务同时以不兼容的方式访问一棵树中的同一子树区域中的节点。也就是说,业务在访问一棵树的时候,先对它将要访问的子树组加锁,加锁成功后才能访问数据。如果业务在对将要访问的子树组A加锁时失败,说明有另一个业务已经对另一个子树组B加了不兼容的锁,而B与A的节点有交集。因此本业务必须等另一个业务处理完毕并释放它的锁后,重新尝试加锁,直到加锁成功后,才能访问数据。这样可以保证,每个业务对加锁的子树组的处理要么是独占的,要么是与其他业务对同一子树组中节点的处理兼容的。
根据相关子树的定义可知:对于一棵树中的两个子树组X和Y,当且仅当子树组X和Y相关时,两个子树组中的节点有交集。因此,加在一个子树组X上的子树锁需要能够阻止对所有与X相关的子树组的不兼容类型的加锁。
2)子树组X与Y相关,当且仅当它们的标识树中的节点有交集
考虑两个去重去包含后的子树组X和Y,如果X与Y是相关的,由相关性的定义可知,一定会有其中一个子树组的至少一棵子树包含另一个子树组的某棵子树。不失一般性,可以令子树组X中的子树A包含子树组Y中的子树B。那么子树A与B的根节点要么重合,要么子树A的根节点位于从子树B的根节点到整棵树的根节点的路径上,也就是子树A和B的根节点到整棵树的根节点的路径有交集。又因为子树组的标识树是由子树组中各个子树的根节点到整棵树的根节点的路径组成的,也就是说,子树组X和Y的标识树中至少各有一个节点,它们到根节点的路径有交集。综上可证:子树组X与Y相关,当且仅当它们的标识树中的节点有交集。
3)对子树组加锁可以通过对其标识树中的每个节点做标记来实现
由1)可知,对一个子树组X加锁时,要检查是否有X的相关子树组已经加了不兼容的锁。如果存在一个X的相关子树组Y已经加了不兼容的锁,那么由2)可知,X和Y的标识树的节点一定有交集。因此,对子树组加锁,可以通过对该子树组的标识树中的每个节点做标记来实现,其原理如下:
对子树组加的锁会体现在该子树组的标识树的节点标记中,而相关子树组的标识树的节点有交集,也就是说相关子树组之间可以通过标识树上的节点标识共享各个子树组加锁的信息,从而在对一个子树组加锁时,可以通过检查它的标识树的节点上的标识,而发现可能存在的已经对相关子树组加了不兼容的锁的情形,进而阻止对一个子树组加与它的某个相关子树组已加的锁不兼容的锁。
检查标识的具体做法是:如果在对一个子树组X的标识树中每个节点做标记时,发现某个节点上已经有标记,说明该节点同时也属于另一个子树组Y的标识树,并且Y已经加了锁。X和Y的标识树节点有交集,说明X与Y相关,因此Y上已有的锁可能会影响到对X加锁是否成功,需要通过进一步检查标记,判断X和Y的锁类型是否兼容,从而确定此次对X的加锁操作是否成功。
为了实现业务软件的高运行效率与高并发,对标识树的节点做的标记应该操作简单,并且能够体现锁的类型,从而通过检查标识可以直接判断出已有的锁与新加的锁的兼容性,而避免复杂的检索与运算。
4)标识树节点标记可以判断出相关子树上是否已加不兼容的锁
通过对标识树的节点做标记来实现对子树组加锁,就需要在加锁时通过标识树节点的已有标记判断出是否有相关子树组已存在不兼容的锁。将子树组拆分为单棵子树考虑,就是判断,对于当前加锁的一棵子树A,是否存在另一棵相关子树B已经加了不兼容的锁。子树A和B的相关性满足下列三种情形之一:
a)情形一:A与B相同,也就是A与B的根节点重合;
也就是说,A的标识树的叶子节点是B的标识树的叶子节点;
b)情形二:A包含B,也就是A的根节点在从B的根节点到整棵树的根节点的路径上;
也就是说,A的标识树的叶子节点是B的标识树的非叶子节点;
c)情形三:B包含A,也就是A的根节点到整棵树的根节点的路径会经过B的根节点;
也就是说,A的标识树的非叶子节点是B的标识树的叶子节点。
子树组是由多个子树组成的,由子树组相关性的定义可知,如果子树组X与Y相关(从而导致不能加不兼容的锁),那么一定存在X中的至少一棵子树A与Y中的至少一棵子树B,A与B的标识树节点有交集,从而导致X与Y的标识树节点有交集。
因此,可以用一种标记方法,将已加锁的子树组X的信息反映到X的标识树的每个节点中,当对另一个子树组Y加锁的时候,检查X和Y的标识树是否有交集,也就是Y的标识树中的每个节点是否已经带有对X加锁时做上的标记。如果存在标记,再根据本次加锁类型与节点的标记,判断Y的锁类型与X的锁类型是否兼容,从而决定本次对Y的加锁操作是否能够成功。
根据上述分析可得结论:在对子树组加锁时,当且仅当该子树组的标识树中的每个节点都满足下表的条件时,加锁操作成功:
表2
5)标识树节点标记的信息与检查方法
表2说明,在对一个子树组X加锁时,可以通过检查X的标识树上每个节点是否满足特定条件,从而判断出该节点是否属于X的相关子树组的标识树并且该相关子树组已被加上不兼容锁,进而确定对X的加锁是否能成功。而为了实现这一点,在对X加锁时就要对X的标识树的每个节点做标记。标记需要包含以下信息:
i.该节点是否X的标识树的叶子节点;
ii.对X加的锁是读锁还是写锁。
对于需要加子树锁的整棵树来说,其中的每个节点都可能属于某个加锁操作对应的子树组的标识树,并且需要通过标识树中节点的标识判断它的子节点是否有锁,因此整棵树中的每个节点都需要存储4个信息:本节点读锁计数、本节点写锁计数、子节点读锁计数、子节点写锁计数。
各个计数值的含义为:
·本节点读锁计数表示:本节点作为已加读锁且尚未释放的子树组的根节点(也就是标识树的叶子节点)的次数;
例如:图1的树中已有两个子树组{C1,C2}和{C1,D2}加了读锁且未释放,那么C1节点的本节点读锁计数为2,C2、D2节点的本节点读锁计数都为1。
·子节点读锁计数表示:本节点的子节点作为已加读锁且尚未释放的子树组的标识树的叶子节点的次数;
例如:图1的树中已有两个子树组{C1,C2}和{C1,D2}加了读锁且未释放,那么A1和B1节点的子节点读锁计数为4,C2节点的子节点读锁计数为1。
·本节点写锁计数、子节点写锁计数同理,只是把读锁换成写锁。
对标识树中节点的标记进行处理是加解锁过程中的关键步骤,包括检查标记、增加标记、去掉标记。为避免多个加解锁操作同时进行时这些标记操作相互干扰,为每棵树设置一个全局Lock,所有的节点标记处理前都需要获取该全局Lock,处理完成后也需要释放该全局Lock,从而让对节点标记的操作在整棵树中全局互斥,这样就可以保证子树锁的加解锁操作的正确性。而由于全局Lock仅覆盖节点标记处理的期间,这段时间与处理业务的耗时相比极为短暂,因此全局Lock不会对整体的并发度和性能产生影响。
这样,就可以得到对子树组X加锁和解锁的操作原理:
a)加锁
对子树组X的加锁操作,包括以下步骤:
i.对子树组X进行去重、去包含;
ii.提取X的标识树;
iii.计算出该标识树的局部标识Map;
iv.获取整棵树的全局Lock;
v.对标识树中的每个节点,根据表2检查该节点是否已有不兼容锁的标记,如果有,说明已经有其他的加锁操作对X的一个相关子树组加了不兼容的锁,本次对X的加锁操作失败,根据失败策略等待重试或放弃;
vi.若检查标记通过,对X的标识树中的每个节点添加标记(若该节点尚无标记)或更新标记(若该节点已有标记),并保存对标记做的变更,以备解锁时还原,本次对X的加锁操作成功结束;
vii.释放整棵树的全局Lock。
这样就完成了对子树组X的加锁操作。
b)解锁
当对已加锁的子树组X解锁时,包括以下步骤:
i.获取之前对子树组加锁时记录的标记变更;
ii.对整棵树进行全局Lock;
iii.将之前加锁时对X的标识树中每个节点的标记做的变更去掉;
iv.释放整棵树的全局Lock。
这样就完成了对子树组X的解锁操作。
可见,对子树组X加锁和解锁的操作,其核心在于节点的标记如何记录、更新及判断兼容性。
8.子树锁的具体算法
本发明提出一种方法,通过设计一种对节点进行标识的数据结构,以及具体的加解锁操作流程,实现上述原理及操作步骤,加锁操作的流程如图3所示。
1)标识的数据结构
为提高加解锁操作的性能,以及在加锁不成功时尽快恢复原先的标识,将每个节点的标识存储在节点之外。本发明引入标识Map,用来存储各个节点的标识。
标识Map是由多个元素组成的数据结构,其中每个元素是键-值对,其中键是节点id,值是该节点的标识数据。节点标识数据是一个由4个整数组成的四元组,记为用括号包围的4个整数:(本节点读锁计数,本节点写锁计数,子节点读锁计数,子节点写锁计数)。标识Map用来表示一组节点本身及其子节点的加锁情况。
本发明为整棵树分配一个标识Map,其中可以包含整棵树的所有节点,称为全局标识Map(GMM);对每个加锁的子树组的标识树也分配一个标识Map,其中可以包含该标识树的所有节点,称为局部标识Map(LMM)。全局标识Map表示整棵树中所有节点本身及其子节点的加锁情况,局部标识Map表示对应的子树组标识树中节点本身及其子节点的加锁情况。
为了简化存储,当一个节点的标识数据的4个计数值全为0的时候,该节点不放入标识Map中,只有当节点的标识数据的4个计数值中至少有一个非0,才放入标识Map。
在一棵树上没有加任何锁的时候,该树的所有节点的所有计数值全为0,因此该树的标识Map为空。
例如:对于图1的树,如果对子树组{C2,D5}加写锁成功、并且对子树组{C1,C3,D6}加读锁成功,那么该树的标识Map如下表所示,或见附图2:
表3
局部标识Map记录一个子树组的标识树中的节点的标识,表示的是:对应的子树组加锁的操作将会导致全局标识Map中的计数值产生的变化值。
2)对子树组加锁的操作算法
a)对子树组去重、去包含
对将要加锁的子树组中每个子树的根节点,向上找它的父节点,对找到的父节点继续向上找父节点,直到整棵树的根节点,就是得到了从一个子树根节点到整棵树的根节点的路径。
如果发现子树组中一个子树的根节点X到整棵树的根节点R的路径上,存在着同一子树组中另一个子树的根节点Y(Y可以与X或R是同一个节点),则说明子树X与Y重叠或X包含在子树Y中,去掉X到R的节点路径。
例如:在图1中,对于子树组{C2,D2,D5},对C2节点向上递归找父节点,得到从C2到根节点A1的路径:C2-->B1-->A1。同理得到从D2到根节点A1的路径:D2-->C2-->B1-->A1、从D5到根节点A1的路径:D5-->C4-->B2-->A1。由于C2位于D2到A1的路径上,这说明子树组中的子树C2包含D2,所以把D2从子树组中去掉。
b)计算出子树组的标识树
经过去重、去包含后,子树组中所有剩下子树的根节点到整棵树根节点的路径中所有节点的并集就是这个子树组的标识树。
接上例,子树组{C2,D2,D5}的标识树就是去重、去包含后剩下的两个子树{C2,D5}的根节点到整棵树根节点的两条路径中包含的节点的并集:{A1,B1,C2,B2,C4,D5}。
c)计算出该标识树的局部标识Map(Local Mark Map,以下缩写为LMM)
i.构造一个空的标识Map。
ii.对于标识树的每个叶子节点,向Map中加入以下元素:
·如果是加读锁,加入:<节点id>-->(1,0,0,0)
·如果是加写锁,加入:<节点id>-->(0,0,1,0)
iii.对于标识树的每个叶子节点,找到它到根节点的路径上的每个节点(不包含该叶子节点),向标识Map中加入以下元素:
·如果是加读锁,加入:<节点id>-->(0,1,0,0)
·如果是加写锁,加入:<节点id>-->(0,0,0,1)
向标识Map中加入元素E时,如果E的节点id已经在标识Map中存在,那么把E的计数四元组中的每个计数值加到标识Map中同一节点id的计数四元组的对应计数值上。这样,如果一个节点有多个子节点是标识树的叶子节点,那么在处理这些叶子节点到根节点的路径时,这个节点会被经过多次,从而会有多个元素加到标识Map中,导致此节点的“子节点读锁计数”或“子节点写锁计数”有大于1的值。
例如,如果对子树组{C2,D5}加读锁,那么对它的标识树计算出的标识Map如下:
表4
c)获取整棵树的全局Lock
d)校验标识
对步骤b)计算出的子树组的局部标识Map(LMM)中的每个元素LE做以下处理:
i.在整棵树的全局标识Map(Global Mark Map,以下缩写为GMM)中查找是否有节点id相同的元素;
ii.如果GMM中没有节点id相同的元素,那么当前元素LE检查通过;
iii.如果GMM中有节点id相同的元素GE,那么获取它的值GEV(也就是节点的4个计数,Global Element Values)。
iv.对LMM中的节点计数值LEV(Local Element Values)的4个计数依次做以下检查:
(1)如果LEV的“本节点读锁计数”不为0,那么GEV的“本节点写锁计数”、“子节点写锁计数”都必须为0;
(2)如果LEV的“子节点读锁计数”不为0,那么GEV的“本节点写锁计数”必须为0;
(3)如果LEV的“本节点写锁计数”不为0,那么GEV的“本节点读锁计数”、“子节点读锁计数”、“本节点写锁计数”、“子节点写锁计数”都必须为0;
(4)如果LEV的“子节点写锁计数”不为0,那么GEV的“本节点读锁计数”、“本节点写锁计数”都必须为0;
v.如果所有4个检查都通过,则当前元素LE检查通过,转步骤i,检查LMM中的下一个元素;如果4个检查中任何一个检查不通过,则当前加锁操作不允许,转步骤f及g;
vi.如果LMM中所有元素都检查通过,那么此次加锁操作被允许,转步骤e;
e)允许加锁,并叠加标识Map
此次加锁操作被允许,将LMM叠加到GMM中。具体做法是:
对LMM中的每个元素LE,在GMM中查找节点id相同的元素。
i.如果没有找到,那么把元素LE直接加入到GMM中;
ii.如果在GMM中找到节点id相同的元素GE,那么将LE的计数四元组中每个计数值加到GE的计数四元组中对应计数值上。
保存本次加锁操作的LMM,以备解锁时使用。继续执行步骤f后停止,加锁成功。
f)释放整棵树的全局Lock。
g)如果步骤d中任何一个元素没有通过检查,则说明正在加锁的子树组已经有相关子树组加了不兼容的锁,因而本次加锁失败。此时GMM尚未做任何改动,无需处理,只需要丢弃提取的LMM即可清理失败的加锁操作。并按照本次加锁时指定的策略处理:
i.直接放弃,返回加锁操作的结果为失败。
ii.等待重试,即等待加锁时指定的一段时长,在这段时间内如果有其他锁释放,则再次从步骤a开始执行,尝试加锁。如果等待总时间超出指定时长还未加锁成功,则返回此次加锁操作的结果为失败。
3)对已加锁的子树组解锁的操作算法
a)获取之前对子树组加锁时生成并保存的局部标识Map(即LMM);
b)获取整棵树的全局Lock;
c)将之前加锁时叠加到GMM上的LMM从GMM去掉。具体做法如下:由加锁算法可知,加锁后对于LMM中的任何元素,在GMM中一定存在相同节点id的元素。对LMM中的每个元素LE,在GMM中找到相同节点id的元素GE后,将LE的计数四元组中每个计数值从GE的计数四元组中对应的计数值上减去。如果GE的4个计数值在减去LE的计数值之后全为0,那么把GE从GMM中移除。
d)释放整棵树的全局Lock,解锁完成。
Claims (10)
1.一种树形数据的加锁方法,其特征在于,子树组是由一个树形数据的多个子树组成,并作为一个整体进行加解锁的操作单元,对子树组的加锁操作,包括:
a.提取子树组去重、去包含后的标识树;
b.提取出该标识树的局部标识Map;
c.获取整棵树的全局Lock;
d.校验标识,对步骤b得到的局部标识Map中的每个元素,取其对应节点在整棵树的全局标识Map中的加锁标记计数值进行对比,以判断此次加锁是否允许;若允许加锁,则转到步骤e;若不允许加锁,则转到步骤f;
e.将局部标识Map叠加到全局标识Map中,并保存局部标识Map,加锁成功,释放整棵树的全局Lock,处理结束;
f.释放整棵树的全局Lock,加锁失败,按失败策略等待重试或放弃。
2.根据权利要求1所述的加锁方法,其特征在于,提取子树组的标识树的方法,对将要加锁的子树组中一个子树的根节点,向上找它的父节点,对找到的父节点继续向上找父节点,直到整棵树的根节点,就得到从一个子树根节点到整棵树的根节点的路径;如果在路径上存在子树组中另一个子树的根节点,则丢弃该节点路径;剩下的所有节点路径中节点的并集就是这个子数组的标识树。
3.根据权利要求1所述的加锁方法,其特征在于,构造标识Map的方法为:标识Map的键是节点id,值是节点标识数据;节点标识数据是一个四元组,包括:本节点读锁计数,本节点写锁计数,子节点读锁计数,子节点写锁计数,为整棵树和每个加锁的子树组各分配一个标识Map。
4.根据权利要求1所述的加锁方法,其特征在于,简化标识Map的方法为:当一个节点的标识数据全为0的时候,该节点不放入标识Map中,只有当节点的标识数据至少有一个非0,才放入标识Map。
5.根据权利要求1所述的加锁方法,其特征在于,该标识树的局部标识Map的提取方法:
首先,构造一个空的标识Map;
其次,对于找到的标识树的每个叶子节点,向Map中加入以下元素:
如果是加读锁:<节点id>-->(1,0,0,0),
如果是加写锁:<节点id>-->(0,0,1,0);
然后,对于找到的标识树的每个叶子节点,找到它到根节点的路径上的每个节点(不包括该叶子节点),向Map中加入以下元素:
如果是加读锁:<节点id>-->(0,1,0,0),
如果是加写锁:<节点id>-->(0,0,0,1)。
6.根据权利要求1或5所述的加锁方法,其特征在于,对局部标识Map中的每个元素的加锁标记计数值LEV,取其对应节点在全局标识Map中的加锁标记计数值GEV进行对比,以判断此次加锁是否允许,对单个元素对比的方法如下:
全局标识Map中不包含同一节点的元素,则当前元素检查通过;
全局标识Map中包含同一节点的元素,则对两个元素的节点计数值做以下检查:
i.如果LEV的“本节点读锁计数”不为0,那么GEV的“本节点写锁计数”、“子节点写锁计数”都必须为0;
ii.如果LEV的“子节点读锁计数”不为0,那么GEV的“本节点写锁计数”必须为0;
iii.如果LEV的“本节点写锁计数”不为0,那么GEV的“本节点读锁计数”、“子节点读锁计数”、“本节点写锁计数”、“子节点写锁计数”都必须为0;
iv.如果LEV的“子节点写锁计数”不为0,那么GEV的“本节点读锁计数”、“本节点写锁计数”都必须为0;
所有4个检查都通过,则当前元素检查通过;如果4个检查中任何一个检查不通过,则当前元素检查不通过。
7.根据权利要求6所述的加锁方法,其特征在于,如果局部标识Map中所有元素都检查通过,那么此次加锁操作被允许;如果任一个元素检查不通过,那么此次加锁操作不允许执行。
8.根据权利要求1或6所述的加锁方法,其特征在于,当对子树组的加锁操作允许时,将子树组的局部标识Map叠加到整棵树的全局标识Map中,其方法为:
对局部标识Map中的每个元素LE,在全局标识Map中查找节点相同的元素;
i.如果没有找到,那么把元素LE直接加入到全局标识Map中;
ii.如果在全局标识Map中找到元素GE,那么将LE的值中的每个计数值加到GE的值中的对应计数值上;
iii.保存本次加锁操作的局部标识Map,以备解锁时使用。
9.对应于权利要求1所述的加锁方法,一种树形数据的解锁方法,其特征在于,一种对树形数据的多个子树作为整体进行解锁的方法,包括:
a.获取之前对子树组加锁时生成并保存的局部标识Map;
b.获取整棵树的全局Lock;
c.将之前加锁时叠加到全局标识Map上的局部标识Map从全局标识Map中去掉;
d.释放整棵树的全局Lock,解锁完成。
10.根据权利要求9所述的解锁方法,其特征在于,将之前加锁时叠加到全局标识Map上的局部标识Map从全局标识Map中去掉,具体做法是:
对局部标识Map中的每个元素LE,在全局标识Map中找到相同节点id的元素GE后,将LE的值中4个计数值从GE的值中对应计数值上减去。经处理后如果GE的值中4个计数值全为0,则将GE从全局标识Map中移除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010347309.3A CN111597193B (zh) | 2020-04-28 | 2020-04-28 | 一种树形数据的加解锁方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010347309.3A CN111597193B (zh) | 2020-04-28 | 2020-04-28 | 一种树形数据的加解锁方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111597193A true CN111597193A (zh) | 2020-08-28 |
CN111597193B CN111597193B (zh) | 2023-09-26 |
Family
ID=72187698
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010347309.3A Active CN111597193B (zh) | 2020-04-28 | 2020-04-28 | 一种树形数据的加解锁方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111597193B (zh) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112541793A (zh) * | 2020-12-23 | 2021-03-23 | 北京五八信息技术有限公司 | 信息处理方法、信息处理装置及电子设备 |
CN114328500A (zh) * | 2020-09-29 | 2022-04-12 | 北京金山云网络技术有限公司 | 一种数据访问方法、装置、设备及计算机可读存储介质 |
CN116719832A (zh) * | 2023-08-07 | 2023-09-08 | 金篆信科有限责任公司 | 数据库并发控制方法和装置、电子设备和存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5276872A (en) * | 1991-06-25 | 1994-01-04 | Digital Equipment Corporation | Concurrency and recovery for index trees with nodal updates using multiple atomic actions by which the trees integrity is preserved during undesired system interruptions |
US20080086470A1 (en) * | 2006-10-06 | 2008-04-10 | Microsoft Corporation | Hierarchical locking in b-tree indexes |
CN103365852A (zh) * | 2012-03-28 | 2013-10-23 | 天津书生软件技术有限公司 | 一种文档库系统中的并发控制方法及系统 |
CN104572568A (zh) * | 2013-10-15 | 2015-04-29 | 阿里巴巴集团控股有限公司 | 读锁操作方法、写锁操作方法及系统 |
CN107783988A (zh) * | 2016-08-26 | 2018-03-09 | 阿里巴巴集团控股有限公司 | 一种目录树的加锁方法及设备 |
US10564850B1 (en) * | 2017-02-28 | 2020-02-18 | Tintri By Ddn, Inc. | Managing known data patterns for deduplication |
CN110990404A (zh) * | 2019-11-27 | 2020-04-10 | 亚信科技(中国)有限公司 | 一种索引数据的处理方法、装置及电子设备 |
-
2020
- 2020-04-28 CN CN202010347309.3A patent/CN111597193B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5276872A (en) * | 1991-06-25 | 1994-01-04 | Digital Equipment Corporation | Concurrency and recovery for index trees with nodal updates using multiple atomic actions by which the trees integrity is preserved during undesired system interruptions |
US20080086470A1 (en) * | 2006-10-06 | 2008-04-10 | Microsoft Corporation | Hierarchical locking in b-tree indexes |
CN103365852A (zh) * | 2012-03-28 | 2013-10-23 | 天津书生软件技术有限公司 | 一种文档库系统中的并发控制方法及系统 |
CN104572568A (zh) * | 2013-10-15 | 2015-04-29 | 阿里巴巴集团控股有限公司 | 读锁操作方法、写锁操作方法及系统 |
CN107783988A (zh) * | 2016-08-26 | 2018-03-09 | 阿里巴巴集团控股有限公司 | 一种目录树的加锁方法及设备 |
US10564850B1 (en) * | 2017-02-28 | 2020-02-18 | Tintri By Ddn, Inc. | Managing known data patterns for deduplication |
CN110990404A (zh) * | 2019-11-27 | 2020-04-10 | 亚信科技(中国)有限公司 | 一种索引数据的处理方法、装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
刘芳;: "逆序树在求解一维数组最长升序序列问题中的应用", 计算机时代, no. 03 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114328500A (zh) * | 2020-09-29 | 2022-04-12 | 北京金山云网络技术有限公司 | 一种数据访问方法、装置、设备及计算机可读存储介质 |
CN112541793A (zh) * | 2020-12-23 | 2021-03-23 | 北京五八信息技术有限公司 | 信息处理方法、信息处理装置及电子设备 |
CN112541793B (zh) * | 2020-12-23 | 2022-04-26 | 北京五八信息技术有限公司 | 信息处理方法、信息处理装置及电子设备 |
CN116719832A (zh) * | 2023-08-07 | 2023-09-08 | 金篆信科有限责任公司 | 数据库并发控制方法和装置、电子设备和存储介质 |
CN116719832B (zh) * | 2023-08-07 | 2023-11-24 | 金篆信科有限责任公司 | 数据库并发控制方法和装置、电子设备和存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN111597193B (zh) | 2023-09-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111597193B (zh) | 一种树形数据的加解锁方法 | |
US8473950B2 (en) | Parallel nested transactions | |
US8271465B2 (en) | Parallel nested transactions in transactional memory | |
EP2356560B1 (en) | Atomic multiple modification of data in a distributed storage system | |
US8271464B2 (en) | Parallel nested transactions in transactional memory | |
US9576038B1 (en) | Consistent query of local indexes | |
EP0457473A2 (en) | Apparatus and method for accessing shared data | |
Lomet et al. | Concurrency and recovery for index trees | |
US20090006407A1 (en) | Parallel nested transactions in transactional memory | |
US9922086B1 (en) | Consistent query of local indexes | |
US5113451A (en) | Method for labelling polygons | |
CN110990404A (zh) | 一种索引数据的处理方法、装置及电子设备 | |
CN114282074B (zh) | 数据库操作方法、装置、设备及存储介质 | |
Taniar et al. | A taxonomy of indexing schemes for parallel database systems | |
US7650352B2 (en) | System and method for increasing availability of an index | |
JP2003271436A (ja) | データ処理方法、データ処理装置およびデータ処理プログラム | |
CN114661719A (zh) | 一种在OpenGauss数据库分区表上在线创建全局索引的方法 | |
Ledelay | Verification of distributed locks: a case study | |
CN111444214A (zh) | 一种大规模数据和工业监控内存数据库处理的方法及装置 | |
Choi | Formal Verification of Chase-Lev Deque in Concurrent Separation Logic | |
König | On the membership and correctness problem for state serializability and value opacity. | |
Sigouin | Concurrent Data Structures Using Multiword Compare and Swap | |
McKenzie | Creating a concurrent in-memory b-tree optimized for numa systems | |
Fekete et al. | Nested transactions, conflict-based locking, and dynamic atomicity | |
CN115964394A (zh) | 一种图数据库的缓存管理的方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |