[发明专利]一种基于分布式数据库的表锁实现方法有效
申请号: | 202110214101.9 | 申请日: | 2021-02-26 |
公开(公告)号: | CN112835982B | 公开(公告)日: | 2023-03-24 |
发明(设计)人: | 张琦;周恒;陈磊;李欣泽 | 申请(专利权)人: | 浪潮云信息技术股份公司 |
主分类号: | G06F16/27 | 分类号: | G06F16/27;G06F16/2455 |
代理公司: | 济南信达专利事务所有限公司 37100 | 代理人: | 郗艳荣 |
地址: | 250100 山东省济南市高*** | 国省代码: | 山东;37 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 分布式 数据库 实现 方法 | ||
1.一种基于分布式数据库的表锁实现方法,其特征在于:当数据库中出现长事务时,通过上表锁将事务要进行读和/或写操作的table变为该事务独有,并将该事务的优先级设置为最大,以保证该事务在与其他事务产生冲突时自身不被回滚;
具体包括以下步骤:
步骤1:在分布式系统启动时自动创建一个系统表lock_table,用于存储表锁的相关信息;
步骤2:在分布式系统的各个节点缓存表级锁信息
在数据库的每个节点构造一个节点级别的缓存,用于将表锁信息缓存到每个节点本地,避免每次获取表锁信息时跨节点和读磁盘,造成巨大的性能损耗;
步骤3:在各个节点加入阻塞队列,用于延迟事务拿到表锁的时间,防止由于锁冲突而立刻回滚;
所述表锁只能在显示事务中通过对应的语法添加,加锁步骤如下:
(1)在使用加锁语法后,通过sql引擎解析加锁语法,将加锁操作发送到目标表所在节点;
(2)通过检查本节点表锁缓存来判断目标表是否已被加锁,如果已被加锁,则进入等待队列;如果表锁缓存中没有目标表的加锁信息,则表示目标表没有被加锁,则在系统表lock_table中写入加锁信息,然后将增量加锁信息通过gossip广播至所有节点;
步骤4:实现保护机制,防止死锁
系统设置阈时间,当事务持有的锁超时时,自动解锁;
当节点宕机时,事务持有的该节点的表的锁自动解锁,阻塞事务全部回滚;
使用死锁检测算法,当多个事务发生死锁时,随机回滚其中一个事务打破死锁;
所述步骤4中,在事务进入等待状态后,开启新携程计时,当超过阈时间的3倍时间后仍未受到更新表锁的信息时,认为广播表锁信息的节点宕机,解锁当前节点中等到状态的事务查询表锁信息,若发现上锁信息已过期,则广播解锁信息。
2.根据权利要求1所述的基于分布式数据库的表锁实现方法,其特征在于:所述步骤1中,当增加/删除表锁信息时,先更新系统表lock_table,然后将更新的表锁信息通过gossip从输入节点传播至全集群每个节点,用于更新各节点的表锁缓存。
3.根据权利要求1或2所述的基于分布式数据库的表锁实现方法,其特征在于:所述步骤3中,利用缓存队列保证FIFO,防止事务饿死;通过心跳更新队列将回滚事务及时从队列中清除。
4.根据权利要求1所述的基于分布式数据库的表锁实现方法,其特征在于:所述表锁解锁时,先执行解锁语法,将目标锁信息从系统表lock_table中删除,然后将删除动作通过gossip广播至所有节点;在所有节点执行删除动作并将加锁信息从缓存中删除,同时唤醒在该表的等待队列上的队首请求,获取该表锁。
5.根据权利要求4所述的基于分布式数据库的表锁实现方法,其特征在于:所述步骤4中,通过语法设置本集群的阈时间,用于每隔该时间更新每个节点的表锁缓存;当事务获取到目标关系存在表锁时,当发现其存储的加锁时间与当下的时间距离超过了阈时间的2倍时,认为该上锁信息已过期,重新构建一条解锁消息覆盖已过期的上锁信息即可。
6.根据权利要求4所述的基于分布式数据库的表锁实现方法,其特征在于:所述步骤4中,当两个事务因产生冲突均进入等待状态产生死锁的情况时,通过使用死锁检测算法,在构建上锁计划层的同时,向store层发送验证是否存在死锁的判断,当发现产生死锁时,随机回滚一个事务。
7.根据权利要求4所述的基于分布式数据库的表锁实现方法,其特征在于:当拥有表锁的事务提交或回滚,但并未解锁时,通过计时器定时加锁的lock操作会失败,当发现加锁失败时,通过新起事务构建解锁消息覆盖原有加锁信息。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于浪潮云信息技术股份公司,未经浪潮云信息技术股份公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110214101.9/1.html,转载请声明来源钻瓜专利网。