2PL(兩階段鎖定)演算法如何工作 -Vlad Mihalcea
2PL(兩階段鎖定)演算法是關聯式資料庫系統用來保證資料完整性的最古老的併發控制機制之一。
在本文中,我將解釋2PL演算法如何工作以及如何以任何程式語言實現它。
鎖型別
在我們開始討論2PL演算法實現之前,解釋讀和寫鎖的工作方式非常重要。
1.讀鎖:讀取或共享鎖定可防止在併發讀取的同時寫入。
2.寫鎖:寫鎖或排他鎖不允許對給定資源進行讀和寫操作。
某些資料庫系統(例如PostgreSQL,MySQL或SQL Server)提供了獲取指定元組或元組範圍上的讀取和寫入鎖的可能性。其他資料庫系統(例如Oracle)僅允許通過FOR UPDATE子句獲取寫/獨佔鎖。
資料庫 Read lock clause Write lock clause Oracle FOR UPDATE FOR UPDATE SQL Server WITH (HOLDLOCK,ROWLOCK) WITH (HOLDLOCK,UPDLOCK, ROWLOCK) PostgreSQL FOR SHARE FOR UPDATE MySQL LOCK IN SHARE MODE FOR UPDATE |
但是,讀和寫鎖不僅限於資料庫系統。傳統上,進入Java synchronized塊允許獲取排他鎖,從1.5版開始,Java允許通過ReentrantReadWriteLock物件進行讀寫鎖。
兩相鎖定/兩段鎖
僅鎖是不足以防止衝突。併發控制策略必須定義如何獲取和釋放鎖,因為這也會影響事務交織。
為此,2PL協議定義了一種鎖定管理策略,以確保嚴格的可序列化性。
2PL協議將事務分為兩部分:
- 擴充套件階段(獲取鎖,並且不允許釋放鎖)
- 收縮階段(釋放所有鎖,並且無法進一步獲取其他鎖)。
對於資料庫事務,擴充套件階段意味著允許從事務開始到結束為止獲取鎖,而收縮階段由提交或回滾階段表示,就像在事務結束時一樣,所有已獲取的鎖鎖被釋放。
下圖顯示了2PL如何協調事務交織:
- 愛麗絲(Alice)和鮑勃(Bob)都post通過SELECT FOR SHARE的PostgreSQL語句獲得了對指定記錄的讀取鎖定。
- 當Bob嘗試對post條目執行UPDATE語句時,其語句被鎖管理器阻止,因為UPDATE語句需要在該post行上獲取寫鎖,而Alice仍對該資料庫記錄保持讀鎖。
- 只有在Alice的事務結束並且釋放了所有鎖之後,Bob才能恢復其UPDATE操作。
- Bob的UPDATE語句將生成鎖升級,因此他先前獲取的讀取鎖將被排他鎖替換,這將防止其他事務獲取同一post記錄上的讀取或寫入鎖。
- 愛麗絲啟動了一個新事務,併發出了SELECT FOR SHARE針對同一post條目的讀取鎖獲取請求的查詢,但是由於鮑勃對該記錄擁有排他鎖,因此該語句被鎖管理器阻止。
- 提交Bob的事務後,將釋放他的所有鎖,並且可以恢復Alice的SELECT查詢。
嚴格的可序列化(可序列化、可線性化)
2PL演算法提供嚴格的可序列化性,這是涉及資料完整性的黃金標準。嚴格的可序列化性意味著結果既可序列化又可線性化。
如果兩個或多個事務的關聯讀取和寫入操作以某種結果等效於某種序列執行的方式交錯,則它們是可序列化的。例如,如果我們有兩個事務A和B,只要結果是A,B或B,A,則這兩個事務都是可序列化的。對於N個事務,結果必須等於N!事務排列之一。
但是,可序列性未考慮時間流。另一方面,線性化意味著基於時間的排序。例如,如果任何後續讀取將反映先前寫入操作所做的更改,則系統是可線性化的。有關Lienearizbaility的更多詳細資訊,請檢視本文。
相關文章
- Mysql 兩階段鎖和死鎖MySql
- 如何啟用Hibernate慢查詢日誌? -Vlad Mihalcea
- 批處理最佳實踐 - Vlad Mihalcea
- 使用 Spring Transactional 註釋的最佳方式 - Vlad MihalceaSpring
- SQL 搜尋方法或鍵集分頁 - Vlad MihalceaSQL
- JDBC驅動程式Maven依賴項大全列表 - Vlad MihalceaJDBCMaven
- 什麼是單主資料庫複製? -Vlad Mihalcea資料庫
- [Mysql]兩階段提交MySql
- 如何通過隧道將本地主機連線到公共網際網路上 - Vlad Mihalcea
- 京東工作階段....
- 使用JPA和Hibernate呼叫儲存過程的最佳方法 - Vlad Mihalcea儲存過程
- 經典的兩階段提交演算法原理及缺陷演算法
- 兩階段終止模式模式
- COBOL六十週年紀念:過去,現在和未來 -Vlad Mihalcea
- 使用DataSource-Proxy在Spring Boot中記錄SQL語句 - Vlad MihalceaSpring BootSQL
- 適合用於資料庫主鍵的最佳UUID工具庫 - Vlad Mihalcea資料庫UI
- 08 MySQL兩階段認證MySql
- vitess兩階段提交事務Vite
- 使用FlexyPool度量你的XA事務連線池合適大小 - Vlad MihalceaFlex
- 兩階段提交2PC 和 三階段提交3pc
- 分散式:分散式事務(CAP、兩階段提交、三階段提交)分散式
- 使用JPA和Hibernate延遲載入實體屬性的最佳方法 - Vlad Mihalcea
- mysql兩階段提交和組提交MySql
- SSL連線分為兩個階段:握手和資料傳輸階段
- 作為DMAIC的第一個階段,Define是如何工作的?AI
- TWI工作指導的四階段法
- 分散式基礎,啥是兩階段提交?分散式
- MySQL兩階段提交過程原理簡述MySql
- 分散式事務(二)之兩階段提交分散式
- 在JPA中請優先使用sequence策略生成實體識別符號的值 - Vlad Mihalcea符號
- 第三階段兩次PTA作業總結
- 手游出海 分階段做好全球釋出工作
- SEO專案操作在不同階段的工作分配
- 統一過程(UP)定義了初啟階段、精化階段、構建階段、移交階段和產生階段,每個階段以達到某個里程碑時結束,其中()的里程碑是生命週期架構。 A.初啟階段 B.精化階段 C.構建階段 D.移交階段架構
- 如何鎖定excel表頭兩行 excel每頁固定表頭列印Excel
- 分散式事務的兩階段提交和三階段提交分別有什麼優缺點?分散式
- Flink sql 之 兩階段聚合與 TwoStageOptimizedAggregateRule(原始碼分析)SQLZed原始碼
- 如何寫一段死鎖程式碼