YaoBase基於MVCC的無鎖化樂觀併發機制
樂觀併發機制是基於記憶體計算資料庫解決鎖代價的主流機制,但是現有的樂觀併發控制存在一些問題,在某些具體場景下仍然存在鎖衝突,寫鎖檢測代價,讀傾斜等問題,這些問題都會降低系統的效能。
YaoBase資料庫採用了一種無鎖化的樂觀併發控制機制,用依賴圖來記錄事務之間的依賴關係,來解除資料庫對鎖的依賴性,提升了分散式事務處理的效能。下面舉例說明YaoBase樂觀併發控制的原理。
在MVCC+2PL併發協議中,多條事務在某段時間內對一條資料進行更新時,只能有一條事務會獲取到該條資料的行鎖,並實施更新操作,其他事務只能等待,或者超過等待時間後事務回滾。如果想要所有事務成功完成,只有降低事務的衝突率,如一次只有一條事務請求該行資料的寫鎖,多條事務序列執行,但是序列執行事務的併發度極低。如圖1的案例,是一個由多個賬戶向某一個特定賬戶轉錢的序列執行示例。且只有1轉賬成功了才能發起新的轉賬操作2,操作2成功後才能有操作3,依次類推。
圖 1 應用案例
如果採用原有MVCC加行鎖的方式,我們假設集體賬戶資料為key=1行,所有個人賬戶對應的資料行為key=2,key=3,……,key=n+1行,每一次從個人賬戶Key=x向集體賬戶key=1轉錢,都需要將集體賬戶key=1行資料進行加鎖,掛未提交鏈,未提交鏈一次只能有一個資料,並且只有等事務完成提交,從未提交鏈轉到已提交鏈後,行鎖才能被釋放,如圖2所示。因此每次只能允許一個賬戶key=x向集體賬戶key=1轉錢。事務只能一條一條執行,併發度很低,我們可以認為事務是序列執行的。
圖 2 兩階段鎖下 key=1 行未提交掛鏈
樂觀協議的思想是事務可讀取未提交資料,但是對於讀到的未提交資料都要記錄依賴關係,我們將事務間的寫寫衝突透過依賴圖來表示,並透過依賴圖來了解併發衝突事務的衝突處理過程。依賴圖相關結構如圖3所示,依賴圖用DisGraph表示,alltransList_儲存所有的事務節點。每一個事務節點透過結構體TransContex表示,儲存事務號transNum_和依賴該事務的事務號transList_,除此之外,為了更快的找到事務節點在依賴圖中的位置,我們在事務管理器中維護事務號和事務號對於節點相關資訊的對映關係,我們將其命名為transCtx_,每個更新節點上的事務節點可以由事務描述符transNum_表示,且一個事務的記憶體在事務沒有結束前不會被分配第二次,因此transCtx_可以讓使用者透過transNum_快速找到事務相關資訊。由於依賴圖是在事務將自己的更新寫入每行資料的未提交鏈時根據未提交鏈的上的事務資訊建立的,如果併發事務間更新的寫集有交集,那麼依賴圖就不可避免。
圖 3 依賴圖資料結構
事務的衝突檢測是利用依賴圖進行的,所有讀寫事務的依賴關係是在事務寫集資料修改的過程中建立的,因此,建立的依賴關係也是隻針對於事務寫集中的資料。事務提交前,需要驗證本事務依賴的事務是否已經全部提交,只有這些事務全部提交,本事務才能進入提交階段;否則事務只能一直等待,且不斷髮起驗證請求,並延遲提交。如果驗證時發現本事務依賴的事務中存在回滾的事務,為了保證事務讀取的因果一致性,本事務必須回滾,回滾的事務會立刻進入提交階段,不過執行的是回滾操作。
針對圖 1的應用案例,key=1行未提交鏈上可以同時寫入多個事務的更新資料,我們可以認為事務是併發執行的,如圖4為無鎖樂觀協議下記憶體資料節點並行掛鏈的示意圖。明顯看出,對於這種情況,大大提高了事務執行的併發度。
圖4 無鎖協議下key=1行未提交掛鏈
YaoBase的無鎖樂觀協議透過依賴圖來儲存事務間的依賴關係,擺脫了對兩階段鎖的依賴,打破了原有事務處理流程,允許大量事務併發執行,從而增加了系統的吞吐量。
YAOBASE(堯)分散式資料庫是一款自主研製具有獨特的增量聚集系統架構的國產金融級NewSQL分散式關係型資料庫軟體,廣泛應用於國民經濟關鍵領域海量、高併發、複雜業務等應用場景。為使用者提供高效能、高安全及高可控的資料庫能力,為海量資料的安全性及自主可控性提供服務。
YAOBASE(堯)分散式資料庫相容 Oracle/DB2/MYSQL 等特性,具備卓越的水平擴充套件能力,特有的增量聚集架構能有效的控制分散式事務比例,大大程度上消弱這一關鍵約束,有效地保證整體效能。因此能更好的適應複雜業務場景,減少使用者在遷移過程中對應用程式的改動,有效控制遷移成本、提升遷移效率、降低遷移風險。
公司官網:
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70021154/viewspace-3000333/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java併發程式設計(05):悲觀鎖和樂觀鎖機制Java程式設計
- ElasticSearch內部基於_version樂觀鎖控制機制Elasticsearch
- Java併發:樂觀鎖Java
- 併發控制——樂觀鎖和悲觀鎖
- 樂觀的併發策略——基於CAS的自旋
- Java開發技巧——併發控制中的樂觀鎖與悲觀鎖Java
- 21_上機動手實戰演練基於_version進行樂觀鎖併發控制
- [轉帖]SQL Server 鎖機制 悲觀鎖 樂觀鎖 實測解析SQLServer
- MySQL的事務機制和鎖(InnoDB引擎、MVCC多版本併發控制技術)MySqlMVC
- MySQL多版本併發控制——MVCC機制分析MySqlMVC
- 22_上機動手實戰演練基於external version進行樂觀鎖併發控制
- Java中的樂觀鎖——無鎖策略Java
- PostgreSQL 併發控制機制(3):基於時間戳的併發控制SQL時間戳
- Java 併發機制底層實現 —— volatile 原理、synchronize 鎖優化機制Java優化
- MySQL多版本併發控制機制(MVCC)-原始碼淺析MySqlMVC原始碼
- 關於樂觀鎖與悲觀鎖的實際應用
- 什麼是qps,tps,併發量,pv,uv、介面冪等性、悲觀鎖樂觀鎖
- 悲觀鎖和樂觀鎖
- Mysql鎖機制與最佳化實踐以及MVCC底層原理剖析MySqlMVC
- 封裝一個簡單的樂觀鎖方法 -基於Laravel 8封裝Laravel
- Java中的鎖之樂觀鎖與悲觀鎖Java
- Mysql MVCC機制MySqlMVC
- msyql樂觀鎖和悲觀鎖
- 理解樂觀鎖和悲觀鎖
- MybatisPlus - [03] 樂觀鎖&悲觀鎖MyBatis
- laravel樂觀鎖和悲觀鎖Laravel
- MySQL鎖(樂觀鎖、悲觀鎖、多粒度鎖)MySql
- 悲觀的併發策略——synchronized互斥鎖synchronized
- JPA和Hibernate的樂觀鎖與悲觀鎖
- Redis的事務、樂觀鎖和悲觀鎖Redis
- MySQL 悲觀鎖與樂觀鎖的詳解MySql
- Java併發程式設計之鎖機制之(ReentrantLock)重入鎖Java程式設計ReentrantLock
- PostgreSQL 併發控制機制(2):表級鎖和行級鎖SQL
- Java併發程式設計中的鎖機制詳解Java程式設計
- 圖解Janusgraph系列-併發安全:鎖機制(本地鎖+分散式鎖)分析圖解分散式
- 樂觀鎖心得
- hibernate 樂觀鎖
- MySQL 樂觀鎖MySql