💻博主現有專欄:
????????????????C51單片機(STC89C516),c語言,c++,離散數學,算法設計與分析,數據結構,Python,Java基礎,MySQL,linux,基于HTML5的網頁設計及應用,Rust(官方文檔重點總結),jQuery,前端vue.js,Javaweb開發,Python機器學習等
🥏主頁鏈接:????????????????Y小夜-CSDN博客
目錄
🎯并發控制概述
🎃丟失修改
🎃不可重復讀
🎃讀“臟”數據
🎯?封鎖
🎃什么是封鎖
🎃基本封鎖類型
🎃鎖的相容矩陣
🎯封鎖協議
🎃一級封鎖協議
🎃二級封鎖協議
🎃三級封鎖協議
🎯并發調度的可串行性
🎃?可串行化調度
🎃沖突可串行化調度
🎯并發控制
🎯并發控制概述
事務是并發控制的基本單位
并發控制機制的任務
- 對并發操作進行正確調度
- 保證事務的隔離性
- 保證數據庫的一致性
并發操作帶來的數據不一致性
- 1.丟失修改(Lost Update)
- 2.不可重復讀(Non-repeatable Read)
- 3.讀“臟”數據(Dirty Read)
記號
- R(x):讀數據x
- W(x):寫數據x
數據不一致性:由于并發操作破壞了事務的隔離性
????????并發控制就是要用正確的方式調度并發操作,使一個用戶事務的執行不受其他事務的干擾,從而避免造成數據的不一致性
????????對數據庫的應用有時允許某些不一致性,例如有些統計工作涉及數據量很大,讀到一些“臟”數據對統計精度沒什么影響,可以降低對一致性的要求以減少系統開銷
并發控制的主要技術
- 封鎖(Locking)
- 時間戳(Timestamp)
- 樂觀控制法
- 多版本并發控制(MVCC)
🎃丟失修改
????????兩個事務T1和T2讀入同一數據并修改,T2的提交結果破壞了T1提交的結果,導致T1的修改被丟失。
🎃不可重復讀
????????不可重復讀是指事務T1讀取數據后,事務T2 ? ? 執行更新操作,使T1無法再現前一次讀取結果。
????????不可重復讀包括三種情況:
(1)事務T1讀取某一數據后,事務T2對其做了修改,當事務T1再次讀該數據時,得到與前一次不同的值
(2)事務T1按一定條件從數據庫中讀取了某些數據記錄后,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄神秘地消失了。
(3)事務T1按一定條件從數據庫中讀取某些數據記錄后,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄。 ? ? ?后兩種不可重復讀有時也稱為幻影現象(Phantom Row)
🎃讀“臟”數據
?讀“臟”數據是指:
- 事務T1修改某一數據,并將其寫回磁盤
- 事務T2讀取同一數據后,T1由于某種原因被撤銷
- 這時T1已修改過的數據恢復原值,T2讀到的數據就與數據庫中的數據不一致
- T2讀到的數據就為“臟”數據,即不正確的數據
🎯?封鎖
🎃什么是封鎖
????????封鎖就是事務T在對某個數據對象(例如表、記錄等)操作之前,先向系統發出請求,對其加鎖
????????加鎖后事務T就對該數據對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數據對象。
????????封鎖是實現并發控制的一個非常重要的技術
🎃基本封鎖類型
????????一個事務對某個數據對象加鎖后究竟擁有什么樣的控制由封鎖的類型決定。
基本封鎖類型
- 排它鎖(Exclusive Locks,簡記為X鎖)
- 共享鎖(Share Locks,簡記為S鎖)
排它鎖又稱為寫鎖
- 若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖
- 保證其他事務在T釋放A上的鎖之前不能再讀取和修改A
共享鎖又稱為讀鎖
- 若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖
- 保證其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改
🎃鎖的相容矩陣
Y=Yes,相容的請求
N=No,不相容的請求
在鎖的相容矩陣中:
- 最左邊一列表示事務T1已經獲得的數據對象上的鎖的類型,其中橫線表示沒有加鎖。
- 最上面一行表示另一事務T2對同一數據對象發出的封鎖請求
- ?T2的封鎖請求能否被滿足用矩陣中的Y和N表示
- Y表示事務T2的封鎖要求與T1已持有的鎖相容,封鎖請求可以滿足
- N表示T2的封鎖請求與T1已持有的鎖沖突,T2的請求被拒絕
🎯封鎖協議
什么是封鎖協議
- 在運用X鎖和S鎖對數據對象加鎖時,需要約定一些規則,這些規則為封鎖協議(Locking Protocol)。
- 何時申請X鎖或S鎖
- 持鎖時間
- 何時釋放
- 對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議,它們分別在不同的程度上為并發操作的正確調度提供一定的保證。
🎃一級封鎖協議
- 一級封鎖協議
- 事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。
- 正常結束(COMMIT)
- 非正常結束(ROLLBACK)
- 一級封鎖協議可防止丟失修改,并保證事務T是可恢復的。
- 在一級封鎖協議中,如果僅僅是讀數據不對其進行修改,是不需要加鎖的,所以它不能保證可重復讀和不讀“臟”數據。
🎃二級封鎖協議
- 二級封鎖協議
- 一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,讀完后即可釋放S鎖。
- 二級封鎖協議可以防止丟失修改和讀“臟”數據。
- 在二級封鎖協議中,由于讀完數據后即可釋放S鎖,所以它不能保證可重復讀。
🎃三級封鎖協議
- 三級封鎖協議
- 一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才釋放。
- 三級封鎖協議可防止丟失修改、讀臟數據和不可重復讀。
🎯并發調度的可串行性
- 數據庫管理系統對并發事務不同的調度可能會產生不同的結果
- 串行調度是正確的
- 執行結果等價于串行調度的調度也是正確的,稱為可串行化調度
🎃?可串行化調度
可串行化(Serializable)調度
- 多個事務的并發執行是正確的,當且僅當其結果與按某一次序串行地執行這些事務時的結果相同
可串行性(Serializability)
- 是并發事務正確調度的準則
- 一個給定的并發調度,當且僅當它是可串行化的,才認為是正確調度
🎃沖突可串行化調度
沖突可串行化
一個比可串行化更嚴格的條件
商用系統中的調度器采用
沖突操作:是指不同的事務對同一數據的讀寫操作和寫寫操作:
? ?? ? ?Ri(x)與Wj(x)?? ? ? ? ? /*事務Ti讀x,Tj寫x,其中i≠j*/
? ? ? ? Wi(x)與Wj(x) ? ? ? ? /*事務Ti寫x,Tj寫x,其中i≠j*/
? ?? ? 其他操作是不沖突操作
🎯并發控制
數據庫管理系統普遍采用兩段鎖協議的方法實現并發調度的可串行性,從而保證調度的正確性
兩段鎖協議
? ? ?指所有事務必須分兩個階段對數據項加鎖和解鎖
- 在對任何數據進行讀、寫操作之前,事務首先要獲得對該數據的封鎖
- ?在釋放一個封鎖之后,事務不再申請和獲得任何其他封鎖
“兩段”鎖的含義
事務分為兩個階段
- ?第一階段是獲得封鎖,也稱為擴展階段
- 事務可以申請獲得任何數據項上的任何類型的鎖,但是不能釋放任何鎖
- ?第二階段是釋放封鎖,也稱為收縮階段
- 事務可以釋放任何數據項上的任何類型的鎖,但是不能再申請任何鎖
學習推薦:
????????在當今這個飛速發展的信息時代,人工智能(AI)已經成為了一個不可或缺的技術力量,它正在逐步改變著我們的生活、工作乃至整個社會的運作方式。從智能語音助手到自動駕駛汽車,從精準醫療到智慧城市,人工智能的應用已經滲透到了我們生活的方方面面。因此,學習和掌握人工智能相關的知識和技能,對于任何希望在這個時代保持競爭力的個人來說,都已經變得至關重要。
????????然而,人工智能是一個涉及數學、計算機科學、數據科學、機器學習、神經網絡等多個領域的交叉學科,其學習曲線相對陡峭,對初學者來說可能會有一定的挑戰性。幸運的是,隨著互聯網教育資源的豐富,現在有大量優秀的在線平臺和網站提供了豐富的人工智能學習材料,包括視頻教程、互動課程、實戰項目等,這些資源無疑為學習者打開了一扇通往人工智能世界的大門。
????????前些天發現了一個巨牛的人工智能學習網站:前言 – 人工智能教程通俗易懂,風趣幽默,忍不住分享一下給大家。