数据库并发控制方法和装置、电子设备和存储介质制造方法及图纸

技术编号:38772010 阅读:10 留言:0更新日期:2023-09-10 10:45
本申请提供了一种数据库并发控制方法和装置、电子设备和存储介质,通过获取对数据库中的目标叶节点进行读操作的读请求;响应于读请求,判断目标叶节点的先辈节点是否持有写锁;在确定目标叶节点的先辈节点均不持有写锁的情况下,获取目标叶节点的当前版本号,并对目标叶节点进行访问,并保存对目标叶节点的查询结果;获取目标叶节点的最新版本号,在确定最新版本号与当前版本号一致的情况下,返回查询结果。通过本申请,解决了相关技术中存在的加锁和释放锁会操作共享内存,多核处理器中每个核对共享内存的操作,会造成其它核上的缓存失效;以及索引树结构上的根节点逻辑修改频率很低,但每次遍历树结构时必须对根节点加锁的问题。问题。问题。

【技术实现步骤摘要】
数据库并发控制方法和装置、电子设备和存储介质


[0001]本申请涉及数据库
,尤其涉及一种数据库并发控制方法和装置、电子设备和存储介质。

技术介绍

[0002]并发控制是数据库的核心问题之一,在多用户的环境下,为了保证数据库的完整性和一致性,数据库引入了锁(lock)机制。锁用于管理对共享资源的并发访问,防止访问相同资源的事务之间的破坏性。数据库中使用了两类锁进行并发控制,读锁(共享锁)和写锁(排它锁)。针对同一块数据,读锁允许多个读操作可以同时进行而不会互相影响,阻塞写操作的并发,而写锁会阻塞其他的读和写操作,直到当前写操作完成。
[0003]加锁和解锁实质是对内存中的索引结构加锁和解锁。大多数据库最常使用B

Tree(Balanced Tree,B树)或其变体作为索引结构,如Mysql、Postgresql和Oracle等。B

Tree一共有两类节点,一类是分支节点(根节点也可被称为分支节点),一类是叶节点,对于内存中的每一个节点,都有一个rw lock(read_write lock,读写锁)与之相对应,用于保护节点内部结构的一致性,阻塞并发修改。
[0004]主流的加锁机制有2PL(2

Phrase Locking,二阶段锁)和Latch coupling(锁耦合)。2PL加锁只在阶段一加锁,只在阶段二解锁,该方案认为树节点是最小的加锁单位,每次需从根节点开始向下搜索树,持有搜索路径上从根节点到叶节点的所有的锁,直到事务提交。Latch coupling先对根节点加锁,之后对下层节点加锁之前必须持有父节点的锁,在保证顺序性的前提下,允许提前释放部分锁。
[0005]随着多核处理器的发展和数据并发的不断提升,目前主流的数据库的加锁机制存在如下问题:1.加锁和释放锁会操作共享内存,多核处理器中每个核对共享内存的操作,会造成其它核上的缓存失效;2.索引树结构上的根节点逻辑修改频率很低,但每次遍历树结构时必须对根节点加锁;3.大部分更新(除拆分和合并索引节点)操作,仅仅修改一个索引节点。

技术实现思路

[0006]本申请提供了一种数据库并发控制方法和装置、电子设备和存储介质,以至少解决相关技术中存在的至少一个技术问题。
[0007]根据本申请实施例的一个方面,提供了一种数据库并发控制方法,包括:获取对数据库中的目标叶节点进行读操作的读请求;响应于所述读请求,判断所述目标叶节点的先辈节点是否持有写锁;在确定所述目标叶节点的先辈节点均不持有写锁的情况下,获取所述目标叶节点的当前版本号,并对所述目标叶节点进行访问,并保存对所述目标叶节点的查询结果,其
中,所述查询结果为所述读请求对所述目标叶节点进行查询得到的结果;获取所述目标叶节点的最新版本号,在确定所述最新版本号与所述当前版本号一致的情况下,返回所述查询结果。
[0008]可选地,如前述的方法,所述响应于所述读请求,判断所述目标叶节点的先辈节点是否持有写锁,包括:响应于所述读请求,判断所述数据库的根节点是否有持有写锁;在所述根节点持有写锁的情况下,执行用于跳转至步骤所述判断所述数据库的根节点是否有持有写锁的重试跳转操作;在所述根节点未持有写锁的情况下,循环执行以下循环步骤,直至访问到所述目标叶节点为止:判断位于第一当前节点下一层的第一下层节点是否持有写锁,其中,所述第一当前节点为所述目标叶节点的先辈节点;在确定所述第一下层节点未持有写锁的情况下,读取所述第一下层节点的当前版本号,并对所述第一下层节点进行访问;在对所述第一下层节点的访问结束后,验证所述第一下层节点的最新版本号是否为当前版本号和/或验证所述第一下层节点是否持有写锁;在所述第一下层节点的最新版本号为当前版本号,且所述第一下层节点未持有写锁的情况下,判断位于所述第一下层节点是否为所述目标叶节点;在所述第一下层节点的最新版本号不是当前版本号和/或所述第一下层节点持有写锁的情况下,执行所述重试跳转操作;在所述第一下层节点为目标叶节点的情况下,退出所述循环步骤;在所述第一下层节点不为所述目标叶节点的情况下,将所述第一下层节点作为最新的第一当前节点,并执行用于跳转至步骤所述判断位于第一当前节点下一层的第一下层节点是否持有写锁的跳转操作。
[0009]可选地,如前述的方法,所述执行所述重试跳转操作,包括:确定历史重试次数,其中,所述历史重试次数用于指示已执行的所述重试跳转操作次数;对所述历史重试次数加1得到重试次数;在所述重试次数未达到预设限定值的情况下,执行所述重试跳转操作。
[0010]可选地,如前述的方法,包括:获取对数据库中的指定叶节点进行写操作的写请求;在响应于所述写请求,访问到所述指定叶节点的情况下,对所述指定叶节点加写锁,并对所述指定叶节点进行修改;在对所述指定叶节点的修改完成后,对所述指定叶节点的当前版本号进行递增更新,得到更新后版本号,并释放所述指定叶节点的写锁。
[0011]可选地,如前述的方法,所述响应于所述写请求,访问到所述指定叶节点,包括:响应于所述写请求,判断所述数据库的根节点是否有持有写锁;在所述根节点持有写锁的情况下,将所述根节点加入等待队列,等待其他线程释放所述根节点的写锁;在所述根节点未持有写锁的情况下,循环执行以下循环步骤,直至访问到所述指定叶节点为止:判断位于第二当前节点下一层的第二下层节点是否持有写锁,其中,所述第二当前节点为所述指定叶节点的先辈节点;在确定所述第二下层节点未持有写锁的情况下,对所述第二下层节点加读锁,释放第二当前节点的读锁,并对所述第二下层节点进行访
问;在对所述第二下层节点的访问结束后,判断所述第二下层节点是否为所述指定叶节点;在所述第二下层节点为所述指定叶节点的情况下,退出所述循环步骤;在所述第二下层节点不为所述指定叶节点的情况下,将所述第二下层节点作为最新的第二当前节点,并执行用于跳转至步骤所述判断位于第二当前节点下一层的第二下层节点是否持有写锁的跳转操作。
[0012]可选地,如前述的方法,所述在确定所述第二下层节点未持有写锁的情况下,对所述第二下层节点加读锁,释放第二当前节点的读锁,并对所述第二下层节点进行访问,包括:在确定所述第二下层节点未持有写锁的情况下,获取所述第二下层节点的读锁,释放第二当前节点的读锁;将所述第二下层节点加入搜索路径的链表中,释放所述第二当前节点的读锁。
[0013]可选地,如前述的方法,在所述读取所述第一下层节点的当前版本号之后,所述方法还包括:将所述第一下层节点的当前版本号存储于用于执行所述前任一项所述方法的写线程的本地内存中。
[0014]根据本申请实施例的另一个方面,还提供了一种数据库并发控制装置,包括:获取模块,用于获取对数据库中的目标叶节点进行读操作的读请求;判断模块,用于响应于所述读请求,判断所述目标叶节点的先辈节点是否持有写锁;保存模块,用于在确定所述目标叶节点的先辈节点均不持有写锁的情况下,获取所述目标叶节点的当前版本号,并对所述目标叶节点进行访问,并保存对所本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种数据库并发控制方法,其特征在于,包括:获取对数据库中的目标叶节点进行读操作的读请求;响应于所述读请求,判断所述目标叶节点的先辈节点是否持有写锁;在确定所述目标叶节点的先辈节点均不持有写锁的情况下,获取所述目标叶节点的当前版本号,并对所述目标叶节点进行访问,并保存对所述目标叶节点的查询结果,其中,所述查询结果为所述读请求对所述目标叶节点进行查询得到的结果;获取所述目标叶节点的最新版本号,在确定所述最新版本号与所述当前版本号一致的情况下,返回所述查询结果。2.根据权利要求1所述的方法,其特征在于,所述响应于所述读请求,判断所述目标叶节点的先辈节点是否持有写锁,包括:响应于所述读请求,判断所述数据库的根节点是否有持有写锁;在所述根节点持有写锁的情况下,执行用于跳转至步骤所述判断所述数据库的根节点是否有持有写锁的重试跳转操作;在所述根节点未持有写锁的情况下,循环执行以下循环步骤,直至访问到所述目标叶节点为止:判断位于第一当前节点下一层的第一下层节点是否持有写锁,其中,所述第一当前节点为所述目标叶节点的先辈节点;在确定所述第一下层节点未持有写锁的情况下,读取所述第一下层节点的当前版本号,并对所述第一下层节点进行访问;在对所述第一下层节点的访问结束后,验证所述第一下层节点的最新版本号是否为当前版本号和/或验证所述第一下层节点是否持有写锁;在所述第一下层节点的最新版本号为当前版本号,且所述第一下层节点未持有写锁的情况下,判断位于所述第一下层节点是否为所述目标叶节点;在所述第一下层节点的最新版本号不是当前版本号和/或所述第一下层节点持有写锁的情况下,执行所述重试跳转操作;在所述第一下层节点为目标叶节点的情况下,退出所述循环步骤;在所述第一下层节点不为所述目标叶节点的情况下,将所述第一下层节点作为最新的第一当前节点,并执行用于跳转至步骤所述判断位于第一当前节点下一层的第一下层节点是否持有写锁的跳转操作。3.根据权利要求2所述的方法,其特征在于,所述执行所述重试跳转操作,包括:确定历史重试次数,其中,所述历史重试次数用于指示已执行的所述重试跳转操作次数;对所述历史重试次数加1得到重试次数;在所述重试次数未达到预设限定值的情况下,执行所述重试跳转操作。4.根据权利要求1所述的方法,其特征在于,所述方法还包括:获取对数据库中的指定叶节点进行写操作的写请求;在响应于所述写请求,访问到所述指定叶节点的情况下,对所述指定叶节点加写锁,并对所述指定叶节点进行修改;在对所述指定叶节点的修改完成后,对所述指定叶节点的当前版本号进行递增更新,得到更新后版本号,并释放所述指定叶节点的写锁。5.根据权利要求4所述的方法,其特征在于,所述响应于所述写请求,访问到所述指定叶节点,包括...

【专利技术属性】
技术研发人员:刘宁付裕
申请(专利权)人:金篆信科有限责任公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1