封鎖-封鎖模式(共享鎖、排他鎖)、封鎖協議(兩階段封鎖協議)

一、引言

1、封鎖技術是目前大多數商用DBMS采用的并發控制技術,封鎖技術通過在數據庫對象上維護鎖來實現并發事務非串行調度的沖突可串行化

2、基于鎖的并發控制的基本思想是:

當一個事務對需要訪問的數據庫對象,例如關系、元組等進行操作之前,要先向系統發出封鎖請求,獲得所訪問的數據庫對象上的鎖,即對數據庫對象進行加鎖來限制并發的其他事務對這些數據對象的訪問

3、DBMS采用的封鎖模式均包括共享鎖和排它鎖,同時采用兩階段封鎖協議來約定鎖的使用,保證并發事務非串行調度的可串行化

二、封鎖模式

由于事務對數據庫對象的操作分為讀操作和寫操作,因此,常用的封鎖模式中也有兩種類型的鎖,一種用于讀,稱作共享鎖,簡稱S鎖,又稱作讀鎖

一種用于寫,稱作排他鎖,簡稱X鎖,又稱作寫鎖

1、共享鎖

(1)若事務T想讀取數據庫對象A而不更新A,事務T必須申請獲得A上的共享鎖

(2)若申請成功,則事務在數據庫對象A上加共享鎖,事務T可以讀A但不能寫A

(3)其他事務只能再對A加共享鎖,而不能加排他鎖

這就保證了其他事務可以讀A,但在事務T釋放A上的共享鎖之前,不能對A作任何更新

2、排他鎖

(1)若事務T不僅要讀取數據庫對象A還要更新A?,事務T必須申請獲得A上的排他鎖

(2)若申請成功,則事務T在數據庫對象A上加排他鎖,事務T不僅可以讀A還能寫A

(3)其他事務不能對A加任何類型的鎖

?這就保證了在事務T釋放A上的排他鎖之前,其它事務不能再讀取和更新A

3、對于任何數據庫對象A,其上只能有一個排他鎖,或者沒有排他鎖而有多個共享鎖,也就是有多個事務可以同時讀取A,但只能有一個事務讀取并更新A

4、為了使并發執行的事務提早執行或提前完成,提高事務的執行效率。如果一個事務T想要讀數據庫對象A并可能更新A,應首先申請A上的一個共享鎖,獲得A上的共享鎖后,友好地對待其他事務,允許其他事務申請并獲得A上的共享鎖,同時讀取A,而僅當事務T準備為A寫入新值時,再申請將加在A上的共享鎖升級為排他鎖。而事務T的鎖升級請求是否會得到滿足,則要看此時數據庫對象A上的加鎖情況

5、在同一數據庫對象上已經被某事務加鎖的情況下,并發控制機制能否同意其他事務的封鎖申請的策略,可用一個鎖相容矩陣來描述

在鎖相容矩陣中,最左邊一列表示在某數據庫對象事務T1已經獲得的鎖,S為共享鎖,X為排他鎖,—表示沒有加鎖,最上邊一行表示另一事務T2該數據庫對象發出的封鎖請求,T2的封鎖請求能否被滿足,用矩陣中的Y和N來表示,Y即YES,表示T2申請的鎖與T1已擁有的鎖相容,封鎖請求可以滿足,N即NO,表示事務T2申請的鎖與T1已持有的鎖沖突,T2的封鎖請求被拒絕

6、現在我們知道如何使用鎖了,對于我們上一節所提到的這個非可串行化的調度,如果我們在調度中,當事務對需要訪問的數據庫對象進行操作之前,要先向系統發出封鎖申請,在讀之前申請讀鎖并獲得鎖,在寫之前升級為寫鎖并獲得鎖,寫完釋放鎖。

這里用Slock(A)表示在某數據對象A上加上共享鎖,Xlock(A)表示在A上加上排他鎖,Unlock(A)表示釋放A上的鎖,也稱解鎖。可以發現,雖然我們正確地進行了封鎖操作,但并沒有解決該并發事務的非可串行化問題

三、封鎖協議

1、在利用封鎖技術對并發事務進行操作時,需要對事務何時申請要訪問的數據庫對象上的鎖何時釋放所獲得的鎖等約定一些規則,即封鎖協議

2、約定不同的規則就形成了各種不同的封鎖協議

3、兩階段封鎖協議是最常用的一種實現可串行化的封鎖協議

四、兩階段封鎖協議

兩階段封鎖協議對事務調度中的封鎖操作的順序進行限制,要求在每個事務中,所有的加鎖操作優先于所有解鎖操作,即每個事務在對數據庫對象進行封鎖時,必須分獲得鎖和釋放鎖兩個階段

1、第一階段是獲得鎖階段,也稱擴展階段

  • 在這個階段,事務要申請得到完成事務操作所需要的所有鎖,只能申請鎖不能釋放鎖

2、第二階段是釋放鎖階段,也稱收縮階段?

  • 在這個階段,事務釋放所獲得的所有鎖不能再申請任何鎖

若事務遵循兩階段封鎖協議,其封鎖操作序列應類似這種形式

先是對需要訪問的各數據對象加鎖,然后再開始釋放鎖,實際應用中,為了便于階段的劃分,通常將釋放鎖階段放在事務結束時的COMMIT或ROLLBACK操作中完成

因此許多DBMS的并發控制機制,采用嚴格的兩階段封鎖協議實現并發事務的可串行化

3、其協議規則包含如下具體內容

  • 事務T在讀一個數據庫對象前,必須獲得該數據庫對象上的讀鎖,如果沒有其他事務擁有這個數據庫對象上的寫鎖,那么事務T的封鎖請求得到滿足,操作繼續執行
  • 事務T在更新一個數據庫對象前,必須獲得該數據庫對象上的寫鎖,如果沒有其他事務擁有這個數據庫對象上的讀鎖或寫鎖,那么事務T的封鎖請求得到滿足,操作繼續執行。若事務T已具有該數據庫對象上的讀鎖,則必須將讀鎖升級為寫鎖,也必須獲得該數據庫對象上的寫鎖
  • 若事務B的封鎖請求與事務A已獲得的鎖不相容時,事務B將處于等待狀態,直到事務A釋放其所擁有的鎖為止
  • 事務所獲得的鎖將一直保持到事務結束才釋放。即直到事務提交或終止且提交或終止日志記錄已被刷新到磁盤后,事務才允許釋放鎖

這就是嚴格封鎖協議的要求

3、前面我們對這個非串行化調度進行的封鎖操作,并沒有解決并發事務的非可串行化問題。若采用嚴格的兩階段封鎖協議,事務T1在讀取數據庫對象X之前,申請并獲得讀鎖,寫數據庫對象之前升級讀鎖為寫鎖,寫后并沒有釋放鎖,然后事務T2對數據庫對象X申請的讀鎖,與事務T1已持有的數據庫對象X上的寫鎖不相容,封鎖請求得不到滿足,事務T2處于等待狀態,事務T1繼續完成對數據庫對象Y的讀寫,事務執行完成,提交后才釋放數據庫對象X和Y上的鎖,事務T2才能夠開始執行,事務T2在事務T1釋放鎖之前被拒絕執行,推遲了將導致非可串行化的操作的執行,調度的執行實際上相當于事務T1先于T2的一個串行調度,實現了并發事務的可串行化

4、對于我們在上一節討論的并發事務帶來的數據不一致問題,比如“臟讀”問題,事務T1在完成之前發生了故障,需撤銷回滾,事務T2讀取了夭折事務T1對X的中間更新結果,是一個臟數據

?

若采用嚴格兩階段封鎖協議進行并發控制,在事務T2因對數據庫對象X申請的讀鎖與事務T1已持有的數據庫對象上的寫鎖不相容而處于等待狀態時,事務T1在完成之前發生了故障,則事務T1終止并撤銷回滾,將X的值恢復為事務開始時的值,事務T1結束才釋放所持有的數據對象X上的鎖,事務T2才能夠開始執行,此時事務T2讀取的是夭折事務T1 ROLLBACK后的值,即事務T1沒執行前的值,是數據庫處于一致性狀態時的值,不再是臟數據?

五、小結

1、封鎖技術通過共享鎖間的相容性,以及排他鎖的排他性,使得并發調度中的非沖突操作并發執行,沖突操作串行執行,實現了沖突可串行化

2、采用封鎖技術進行并發控制的DBMS,在具體實現時使用的鎖類型,除了共享鎖和排他鎖兩種基本鎖外,為了事務能夠高效地并發執行并減少死鎖的發生,還會使用一些其他類型的鎖,形成相應的封鎖策略及對應的鎖相容矩陣,以及采用更能便于應用執行的封鎖協議,而不一定是可串行化的嚴格的兩階段封鎖協議

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40562.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【嵌入式開發 Linux 常用命令系列 1.6 -- grep 過濾指定的目錄】

請閱讀【嵌入式開發學習必備專欄 】 文章目錄 grep 過濾指定目錄 grep 過濾指定目錄 在Linux中使用grep搜索字符串并希望排除特定目錄時,可以使用--exclude-dir參數。這個參數允許你指定一個或多個目錄名稱來排除它們的內容不被grep搜索。這對于忽略一些常見的臨時…

LLM - 詞向量 Word2vec

1. 詞向量是一個詞的低維表示,詞向量可以反應語言的一些規律,詞意相近的詞向量之間近乎于平行。 2. 詞向量的實現: (1)首先使用滑動窗口來構造數據,一個滑動窗口是指在一段文本中連續出現的幾個單詞&#x…

llamaindex實戰-使用本地大模型和數據庫對話

概述 本文使用NLSQLTableQueryEngine 查詢引擎來構建SQL的自然語言處理查詢。 請注意,我們需要指定要與該查詢引擎一起使用的表。如果我們不這樣做,查詢引擎將提取所有架構上下文,這可能會溢出 LLM 的上下文窗口。 在以下情況都可以使用NL…

如何用Java寫一個整理Java方法調用關系網絡的程序

大家好,我是猿碼叔叔,一位 Java 語言工作者,也是一位算法學習剛入門的小學生。很久沒有為大家帶來干貨了。 最近遇到了一個問題,大致是這樣的:如果給你一個 java 方法,如何找到有哪些菜單在使用。我的第一想…

線程中如何有效避免死鎖問題

1. 理解死鎖形成的原因 互斥條件:一個資源每次只能被一個線程使用。 請求與保持條件:線程因請求資源而阻塞時,對已獲得的資源保持不放。 不剝奪條件:線程已獲得的資源,在末使用完之前,不能強行剝奪。 循環…

c++ primer plus 第15章友,異常和其他:15.1.3 其他友元關系

c primer plus 第15章友,異常和其他:15.1.3 其他友元關系 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 15.1.3 其他友元關系 提示:寫完文章后,目錄可以自動生成,如何生成可…

整潔架構SOLID-單一職責原則(SRP)

文章目錄 定義案例分析重復的假象代碼合并解決方案 小結 定義 SRP是SOLID五大設計原則中最容易被誤解的一個。也許是名字的原因,很多程序員根據SRP這個名字想當然地認為這個原則就是指:每個模塊都應該只做一件事。 在歷史上,我們曾經這樣描…

科研繪圖系列:R語言雙側條形圖(bar Plot)

介紹 雙側條形圖上的每個條形代表一個特定的細菌屬,條形的高度表示該屬的LDA得分的對數值,顏色用來區分不同的分類群或組別,它具有以下優點: 可視化差異:條形圖可以直觀地展示不同細菌屬在得分上的差異。強調重要性:較高的條形表示某些特征在區分不同組別中具有重要作用…

# Sharding-JDBC從入門到精通(6)-- Sharding-JDBC 水平分庫 和 垂直分庫。

Sharding-JDBC從入門到精通&#xff08;6&#xff09;-- Sharding-JDBC 水平分庫 和 垂直分庫。 一、Sharding-JDBC 水平分庫-分片策略配置 1、分庫策略定義方式如下 # 分庫策略&#xff0c;如何將一個邏輯表映射到多個數據源 spring.shardingsphere.sharding.tables.<邏…

第33集《大乘起信論》

《大乘起信論》和尚尼慈悲&#xff0c;諸位法師、諸位居士&#xff0c;阿彌陀佛&#xff01;&#xff08;阿彌陀佛&#xff01;&#xff09;請大家打開《講義》第七十四頁&#xff0c;子二、釋觀。 本論的特色&#xff0c;一言以蔽之就是文簡意賅、辭約理富&#xff0c;就是說…

VUE2拖拽組件:vue-draggable-resizable-gorkys

vue-draggable-resizable-gorkys組件基于vue-draggable-resizable進行二次開發, 用于可調整大小和可拖動元素的組件并支持沖突檢測、元素吸附、元素對齊、輔助線 安裝: npm install --save vue-draggable-resizable-gorkys 全局引用: import Vue from vue import vdr fro…

嵌入式linux面試1

1. linux 1.1. Window系統和Linux系統的區別 linux區分大小寫windows在dos&#xff08;磁盤操作系統&#xff09;界面命令下不區分大小寫&#xff1b; 1.2. 文件格式區分 windows用擴展名區分文件&#xff1b;如.exe代表執行文件&#xff0c;.txt代表文本文件&#xff0c;.…

運用Python與Keras框架打造深度學習圖像分類應用:詳盡步驟與代碼實例解析

引言 隨著深度學習技術的飛速發展&#xff0c;其在圖像識別和分類領域的應用日益廣泛。在這一背景下&#xff0c;Python因其豐富的數據科學庫和強大的生態系統而成為首選編程語言之一。在本文中&#xff0c;我們將深入探討如何使用Python和其中的Keras深度學習框架來完成一個實…

手動將dingtalk-sdk-java jar包打入maven本地倉庫

有時候,中央鏡像庫不一定有自己需要的jar包,這時候我們就需要用到該方法,將jar打入maven本地倉庫,然后項目中,正常使用maven的引入規則。 mvn install:install-file -Dmaven.repo.local=D:\software\maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\repo -DgroupId=ding…

學習筆記——交通安全分析11

目錄 前言 當天學習筆記整理 4信控交叉口交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后&#xff0c;本人又開始了新教材《交通安全分析》的學習 #整理過程不易&#xff0c;喜歡UP就點個免費的關注趴 #本期內容接上一期10筆記 #最近確實太懶了&#xff0c;接受…

跨越數據邊界:域適應在目標檢測中的革新作用

標題&#xff1a;跨越數據邊界&#xff1a;域適應在目標檢測中的革新作用 在機器學習和計算機視覺領域&#xff0c;尤其是目標檢測任務中&#xff0c;域適應&#xff08;Domain Adaptation&#xff09;是一種關鍵技術&#xff0c;它解決了模型在不同數據分布上的泛化問題。當訓…

C語言字節對齊技術在嵌入式、網絡與操作系統中的應用與優化

第一部分&#xff1a;嵌入式系統中的字節對齊 嵌入式系統通常對性能和資源有著嚴格的要求。在這些系統中&#xff0c;字節對齊的正確使用可以顯著提高數據訪問速度&#xff0c;減少內存占用&#xff0c;并提高系統的整體效率。 一、嵌入式系統中的字節對齊挑戰 嵌入式系統中…

Caffeinated for Mac v2.0.6 Mac防休眠應用 兼容 M1/M2/M3

Caffeinated 可以防止您的 Mac 進入休眠狀態、屏幕變暗或者啟動屏幕保護。 應用介紹 您的屏幕是否總是在您不希望的時候變暗&#xff1f;那么Caffeinated就是您解決這個大麻煩的最好工具啦。Caffeinated是在Caffeine這個非常便捷、有用的工具的基礎上開發而來的。Caffeinated…

215. 數組中的第K個最大元素(中等)

215. 數組中的第K個最大元素 1. 題目描述2.詳細題解3.代碼實現3.1 Python3.2 Java 1. 題目描述 題目中轉&#xff1a;215. 數組中的第K個最大元素 2.詳細題解 快速排序算法在每一輪排序中&#xff0c;隨機選擇一個數字 x x x&#xff0c;根據與 x x x的大小關系將要排序的數…

PMP–知識卡片--PDCA循環

記憶 PDCA&#xff1a;計劃執行檢查調整&#xff0c;計劃觀察動作&#xff1b;plan do check action 定義 PDCA循環的含義是將質量管理分為四個過程&#xff0c;即計劃&#xff08;Plan&#xff09;、執行&#xff08;Do&#xff09;、檢查&#xff08;Check&#xff09;、處…