[發明專利]一種基于分布式數據庫的表鎖實現方法有效
| 申請號: | 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.szxzyx.cn/pat/books/202110214101.9/2.html,轉載請聲明來源鉆瓜專利網。





