剖析数据库中重要而又常被曲解的概念
剖析數據庫中重要而又常被曲解的概念
- 排他鎖
- 共享鎖
- 意向鎖
- 粒度樹
- 意向鎖
- 兩段鎖協議
- 一級封鎖協議
- 二級封鎖協議
- 三級封鎖協議
- 臟讀
- 不可重復讀
- 幻影行
- 可串行化
排他鎖
- 排他鎖(exclusive locks):指的滿足此條件的鎖:當某事務對某數據加上排他鎖之后,直到該事務釋放這個鎖之前,其它事務不能再對這個數據再加排他鎖和共享鎖。
共享鎖
- 共享鎖(share locks):指的滿足此條件的鎖:當某事務對某數據加上共享鎖之后,直到所有事務都釋放了對該數據加上的共享鎖之前,任何事務都不能對該數據加上排他鎖,但可以對其加共享鎖。
【注意】
??排他鎖、共享鎖本身是無法直接限制事務對數據的讀取和修改的。之所以看起來它們能夠控制對數據的讀取和修改,這需要依賴每個事務在讀取和修改數據之前必須要遵守某種約定,這就是:如果要求在某些條件下,某事務需要加某種鎖才能對數據進行操作,那么,所有其它事務在遇到同樣情況下,也強制必須先加鎖才能對數據進行操作,如果加鎖加失敗,則該事務需要等待。而鎖之間是有排斥法則的,所以可以通過這個法則來間接實現對數據讀取和修改上的限制。
??排他鎖對應的要求條件往往是在對數據的修改之前,共享鎖對應的則是讀取。也就是說,如果對事務啟用排他鎖,往往意味著,任何事務在修改數據之前都要先加排他鎖。如果對事務啟用共享鎖,往往意味著任何事務在讀取數據之前都要先加共享鎖。不過,可以自行規定加鎖時機。
意向鎖
??介紹這個概念之前,需要知道什么是粒度樹。
粒度樹
- 粒度樹:不同資源在概念上的包含關系稱為粒度。不同資源之間的概念粒度會有不同,如行的粒度與表的粒度就有不同。一個資源可以分為粒度更小的資源。按照資源之間的包含關系所建立的樹狀結構稱為粒度樹。
意向鎖
-
意向鎖:對粒度樹中的某一個結點加意向鎖時,代表這個結點下至少有一個子孫結點將要被加上 排他鎖 或 共享鎖。
【提示】
??意向鎖是為了減少對多粒度資源加 排他鎖 或 共享鎖 時的開銷。
兩段鎖協議
-
兩段鎖(Two Phase Locking,簡稱 2PL)協議:當一個事務需要對很多資源加鎖時,如果對這些資源的加鎖順序可分為如下兩個階段,則稱其符合兩段鎖協議:
-
拓展階段:只進行加鎖,不進行釋放鎖。
-
收縮階段:只釋放鎖,不進行加鎖。
如果該事務對這些資源進行適當分組,使得對每一組的加鎖順序都符合兩段鎖協議,則稱該事務對整個資源的加鎖順序也符合兩段鎖協議。
【提示】
??事務調度遵守兩段鎖協議時,一定滿足可串行化,但遵守兩段鎖協議不是滿足可串行化的充要條件。
-
一級封鎖協議
-
一級封鎖協議:規定:任何事務在修改數據之前,必須先對其加本事務結束才會釋放的排他鎖,然后在加鎖成功之后才能修改數據。
一級封鎖協議不能防止臟讀、不可重復讀。
二級封鎖協議
-
二級封鎖協議:規定:任何事務除了要遵守一級封鎖協議之外,還應該遵守:在讀取數據之前,
-
如果自己已經對該數據加上了排他鎖或共享鎖,則直接讀取數據,不再額外加鎖。
-
如果自己此時沒有對該數據加上排他鎖或共享鎖,則必須先對其加共享鎖,然后在加鎖成功之后才能讀取數據,不過在讀取完數據之后就釋放共享鎖。
二級封鎖協議不能防止不可重復讀。
-
三級封鎖協議
-
三級封鎖協議:規定:任何事務除了要遵守一級封鎖協議之外,還應該遵守:在讀取數據之前,
-
如果自己已經對該數據加上了排他鎖或共享鎖,則直接讀取數據,不再額外加鎖。
-
如果自己此時沒有對該數據加上排他鎖或共享鎖,則必須先對其加本事務結束才會釋放的共享鎖,然后在加鎖成功之后才能讀取數據。
三級封鎖協議可以防止臟讀、不可重復讀,但不能防止舊讀。
-
臟讀
-
臟讀(dirty read):如果一個事務在讀取數據之前,讀到的是某事務在修改后、但提交之前的數據,這稱為臟讀。
【注意】
??如果某事務讀取到的數據是歷史時期的某個一致性狀態下的數據,這不能稱之為 臟讀,這應該叫做舊讀。臟讀 讀出來的數據是一個處于中間狀態下的數據,這種數據是沒有意義的。而 舊讀 讀出來的數據是一種曾經的正確數據,使用這種數據有可能會導致問題,有可能不會。
不可重復讀
- 不可重復讀(nonrepeatable read):在上一次查詢之后,如果本事務沒有主動變更數據,當本事務再次以相同的條件查詢數據時,得到的數據與上一次不一致。(變更指更新、插入、刪除,但不包括查找)
幻影行
-
幻影行(phantom row):對于不同的數據庫,可以是以下定義之一。
-
在上一次查詢之后,如果本事務沒有主動變更數據,當本事務再次以相同的條件查詢數據時,與上一次相比,數據的個數發生了變化。(變更指更新、插入、刪除,但不包括查找)
在這個定義中,幻影行屬于不可重復讀的范疇。
-
滿足以下條件之一即視為出現了幻影行:
-
某事務連續以相同的條件查詢數據時,查詢的結果不全相同。(連續指的是查詢操作中沒有夾雜其它操作)
-
本次變更數據時,涉及變更前的查詢中不存在的數據,但此操作沒有引發異常,而是成功變更了該數據。隨后本事務再次以相同的條件查詢數據時,與上一次查詢相比,數據的個數發生了變化。(變更指更新、插入、刪除,但不包括查找)
在這個定義中,幻影行不一定屬于不可重復讀。
-
-
【注意】
??不可重復讀、幻影行描述的都是同一事務的操作。
-
如果一個事務已經結束,然后又開啟新的事務,此時這兩個事務分別的查詢結果不能用于證明事務是否滿足不可重復讀、幻影行。
很多情況都會導致事務結束,如事務的提交、回滾、執行 DDL 語句、客戶端斷開等等。
-
同一事務要求當前正在觀測的事務不能結束,否則該事務結束之后的操作就不能隸屬于同一事務。但這僅限于這正在被觀測的事務,其它事務是可以任意開啟、隨時結束,這不影響對同一事務的要求。
可串行化
-
可串行化(Serializable):如果一種調度事務執行的策略,使得每次多個事務并發執行時,其執行結果如果屬于下面這個執行結果集中的任何一個結果,就認為這種調度策略滿足可串行化。
-
任意排列這些事務的執行次序。
-
令這些事務依次執行,且上一次事務執行完,下一個事務才能執行。
-
總結
以上是生活随笔為你收集整理的剖析数据库中重要而又常被曲解的概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java RMI 入门
- 下一篇: 如何验证 MySQL 的 InnoDB