[发明专利]一种基于分布式数据库的表锁实现方法有效
申请号: | 202110214101.9 | 申请日: | 2021-02-26 |
公开(公告)号: | CN112835982B | 公开(公告)日: | 2023-03-24 |
发明(设计)人: | 张琦;周恒;陈磊;李欣泽 | 申请(专利权)人: | 浪潮云信息技术股份公司 |
主分类号: | G06F16/27 | 分类号: | G06F16/27;G06F16/2455 |
代理公司: | 济南信达专利事务所有限公司 37100 | 代理人: | 郗艳荣 |
地址: | 250100 山东省济南市高*** | 国省代码: | 山东;37 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 分布式 数据库 实现 方法 | ||
本发明特别涉及一种基于分布式数据库的表锁实现方法。该基于分布式数据库的表锁实现方法,当数据库中出现长事务时,通过上表锁将事务要进行读和/或写操作的table变为该事务独有,并将该事务的优先级设置为最大,以此保证该事务在与其他事务产生冲突时自身不被回滚。该基于分布式数据库的表锁实现方法,不仅能够显著降低长事务回滚的频率,而且表锁信息在各个节点均设有缓存,提高了表锁信息的获取效率。
技术领域
本发明涉及数据库技术领域,特别涉及一种基于分布式数据库的表锁实现方法。
背景技术
MySQL常用引擎有MyISAM和InnoDB,而InnoDB是mysql默认的引擎。MyISAM不支持行锁,只有表级锁,而InnoDB支持行锁和表锁。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。
PostgreSQL的表级锁通常是各种命令执行时自动获取的,或者通过事务中的LOCK语句显式获取;LOCK TABLE命令用于获取一个表锁,获取过程将阻塞一直到等待的锁被其他事务释放。如果使用NOWAIT关键字则如果获取不到锁,将不会等待而是直接返回,放弃执行当前指令并抛出一个错误(error)。一旦获取到锁,将一直持有锁直到事务结束(没有主动释放锁的命令,锁总是会在事务结束的时候被释放)。
但是上述两种表锁的实现方式都是基于单机数据库,在分布式数据库中这种实现方式已经不再适用。
针对数据库中长事务提交失败造成的性能浪费,本发明提出了一种基于分布式数据库的表锁实现方法。
发明内容
本发明为了弥补现有技术的缺陷,提供了一种简单高效的基于分布式数据库的表锁实现方法。
本发明是通过如下技术方案实现的:
一种基于分布式数据库的表锁实现方法,其特征在于:当数据库中出现长事务时,通过上表锁将事务要进行读和/或写操作的table(表)变为该事务独有,并将该事务的优先级设置为最大,以保证该事务在与其他事务产生冲突时自身不被回滚;
具体包括以下步骤:
步骤1:在分布式系统启动时自动创建一个系统表lock_table,用于存储表锁的相关信息;
步骤2:在分布式系统的各个节点缓存表级锁信息;
在数据库的每个节点构造一个节点级别的缓存(cache),用于将表锁信息缓存到每个节点本地,避免每次获取表锁信息时跨节点和读磁盘,造成巨大的性能损耗;
步骤3:在各个节点加入阻塞队列,用于延迟事务拿到表锁的时间,防止由于锁冲突而立刻回滚;
步骤4:实现保护机制,防止死锁;
系统设置阈时间(thresholdtime),当事务持有的锁超时时,自动解锁;
当节点宕机时,事务持有的该节点的表的锁自动解锁,阻塞事务全部回滚;
使用死锁检测算法,当多个事务发生死锁时,随机回滚其中一个事务打破死锁。
所述步骤1中,当增加/删除表锁信息时,先更新系统表lock_table,然后将更新的表锁信息通过gossip从输入节点传播至全集群每个节点,用于更新各节点的表锁缓存。
所述步骤3中,利用缓存队列保证FIFO(First Input First Output,先入先出队列),防止事务饿死;通过心跳更新队列将回滚(abort或rollback)事务及时从队列中清除。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于浪潮云信息技术股份公司,未经浪潮云信息技术股份公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110214101.9/2.html,转载请声明来源钻瓜专利网。