日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

剖析數(shù)據(jù)庫中重要而又常被曲解的概念

作者:暗諾星刻 更新時間: 2022-05-11 編程語言

剖析數(shù)據(jù)庫中重要而又常被曲解的概念

  • 排他鎖
  • 共享鎖
  • 意向鎖
    • 粒度樹
    • 意向鎖
  • 兩段鎖協(xié)議
  • 一級封鎖協(xié)議
  • 二級封鎖協(xié)議
  • 三級封鎖協(xié)議
  • 臟讀
  • 不可重復讀
  • 幻影行
  • 可串行化

排他鎖

  • 排他鎖(exclusive locks):指的滿足此條件的鎖:當某事務對某數(shù)據(jù)加上排他鎖之后,直到該事務釋放這個鎖之前,其它事務不能再對這個數(shù)據(jù)再加排他鎖和共享鎖。

共享鎖

  • 共享鎖(share locks):指的滿足此條件的鎖:當某事務對某數(shù)據(jù)加上共享鎖之后,直到所有事務都釋放了對該數(shù)據(jù)加上的共享鎖之前,任何事務都不能對該數(shù)據(jù)加上排他鎖,但可以對其加共享鎖。

【注意】

??排他鎖、共享鎖本身是無法直接限制事務對數(shù)據(jù)的讀取和修改的。之所以看起來它們能夠控制對數(shù)據(jù)的讀取和修改,這需要依賴每個事務在讀取和修改數(shù)據(jù)之前必須要遵守某種約定,這就是:如果要求在某些條件下,某事務需要加某種鎖才能對數(shù)據(jù)進行操作,那么,所有其它事務在遇到同樣情況下,也強制必須先加鎖才能對數(shù)據(jù)進行操作,如果加鎖加失敗,則該事務需要等待。而鎖之間是有排斥法則的,所以可以通過這個法則來間接實現(xiàn)對數(shù)據(jù)讀取和修改上的限制。

??排他鎖對應的要求條件往往是在對數(shù)據(jù)的修改之前,共享鎖對應的則是讀取。也就是說,如果對事務啟用排他鎖,往往意味著,任何事務在修改數(shù)據(jù)之前都要先加排他鎖。如果對事務啟用共享鎖,往往意味著任何事務在讀取數(shù)據(jù)之前都要先加共享鎖。不過,可以自行規(guī)定加鎖時機。


意向鎖

??介紹這個概念之前,需要知道什么是粒度樹。

粒度樹

  • 粒度樹:不同資源在概念上的包含關系稱為粒度。不同資源之間的概念粒度會有不同,如行的粒度與表的粒度就有不同。一個資源可以分為粒度更小的資源。按照資源之間的包含關系所建立的樹狀結(jié)構(gòu)稱為粒度樹。

意向鎖

  • 意向鎖:對粒度樹中的某一個結(jié)點加意向鎖時,代表這個結(jié)點下至少有一個子孫結(jié)點將要被加上 排他鎖共享鎖


    【提示】

    ??意向鎖是為了減少對多粒度資源加 排他鎖共享鎖 時的開銷。


兩段鎖協(xié)議

  • 兩段鎖(Two Phase Locking,簡稱 2PL)協(xié)議:當一個事務需要對很多資源加鎖時,如果對這些資源的加鎖順序可分為如下兩個階段,則稱其符合兩段鎖協(xié)議:

    • 拓展階段:只進行加鎖,不進行釋放鎖。

    • 收縮階段:只釋放鎖,不進行加鎖。

    如果該事務對這些資源進行適當分組,使得對每一組的加鎖順序都符合兩段鎖協(xié)議,則稱該事務對整個資源的加鎖順序也符合兩段鎖協(xié)議。


    【提示】

    ??事務調(diào)度遵守兩段鎖協(xié)議時,一定滿足可串行化,但遵守兩段鎖協(xié)議不是滿足可串行化的充要條件。


一級封鎖協(xié)議

  • 一級封鎖協(xié)議:規(guī)定:任何事務在修改數(shù)據(jù)之前,必須先對其加本事務結(jié)束才會釋放的排他鎖,然后在加鎖成功之后才能修改數(shù)據(jù)。

    一級封鎖協(xié)議不能防止臟讀、不可重復讀。

二級封鎖協(xié)議

  • 二級封鎖協(xié)議:規(guī)定:任何事務除了要遵守級封鎖協(xié)議之外,還應該遵守:在讀取數(shù)據(jù)之前,

    • 如果自己已經(jīng)對該數(shù)據(jù)加上了排他鎖或共享鎖,則直接讀取數(shù)據(jù),不再額外加鎖。

    • 如果自己此時沒有對該數(shù)據(jù)加上排他鎖或共享鎖,則必須先對其加共享鎖,然后在加鎖成功之后才能讀取數(shù)據(jù),不過在讀取完數(shù)據(jù)之后就釋放共享鎖。

    二級封鎖協(xié)議不能防止不可重復讀。

三級封鎖協(xié)議

  • 三級封鎖協(xié)議:規(guī)定:任何事務除了要遵守級封鎖協(xié)議之外,還應該遵守:在讀取數(shù)據(jù)之前,

    • 如果自己已經(jīng)對該數(shù)據(jù)加上了排他鎖或共享鎖,則直接讀取數(shù)據(jù),不再額外加鎖。

    • 如果自己此時沒有對該數(shù)據(jù)加上排他鎖或共享鎖,則必須先對其加本事務結(jié)束才會釋放的共享鎖,然后在加鎖成功之后才能讀取數(shù)據(jù)。

    三級封鎖協(xié)議可以防止臟讀、不可重復讀,但不能防止舊讀。

臟讀

  • 臟讀(dirty read):如果一個事務在讀取數(shù)據(jù)之前,讀到的是某事務在修改后、但提交之前的數(shù)據(jù),這稱為臟讀。


    【注意】

    ??如果某事務讀取到的數(shù)據(jù)是歷史時期的某個一致性狀態(tài)下的數(shù)據(jù),這不能稱之為 臟讀,這應該叫做讀。臟讀 讀出來的數(shù)據(jù)是一個處于中間狀態(tài)下的數(shù)據(jù),這種數(shù)據(jù)是沒有意義的。而 舊讀 讀出來的數(shù)據(jù)是一種曾經(jīng)的正確數(shù)據(jù),使用這種數(shù)據(jù)有可能會導致問題,有可能不會。


不可重復讀

  • 不可重復讀(nonrepeatable read):在上一次查詢之后,如果本事務沒有主動變更數(shù)據(jù),當本事務再次以相同的條件查詢數(shù)據(jù)時,得到的數(shù)據(jù)與上一次不一致。(變更指更新、插入、刪除,但不包括查找)

幻影行

  • 幻影行(phantom row):對于不同的數(shù)據(jù)庫,可以是以下定義之一。

    • 在上一次查詢之后,如果本事務沒有主動變更數(shù)據(jù),當本事務再次以相同的條件查詢數(shù)據(jù)時,與上一次相比,數(shù)據(jù)的個數(shù)發(fā)生了變化。(變更指更新、插入、刪除,但不包括查找)

      在這個定義中,幻影行屬于不可重復讀的范疇。

    • 滿足以下條件之一即視為出現(xiàn)了幻影行:

      • 某事務連續(xù)以相同的條件查詢數(shù)據(jù)時,查詢的結(jié)果不全相同。(連續(xù)指的是查詢操作中沒有夾雜其它操作)

      • 本次變更數(shù)據(jù)時,涉及變更前的查詢中不存在的數(shù)據(jù),但此操作沒有引發(fā)異常,而是成功變更了該數(shù)據(jù)。隨后本事務再次以相同的條件查詢數(shù)據(jù)時,與上一次查詢相比,數(shù)據(jù)的個數(shù)發(fā)生了變化。(變更指更新、插入、刪除,但不包括查找)

      在這個定義中,幻影行一定屬于不可重復讀。


【注意】

??不可重復讀、幻影行描述的都是同一事務的操作。

  • 如果一個事務已經(jīng)結(jié)束,然后又開啟新的事務,此時這兩個事務分別的查詢結(jié)果不能用于證明事務是否滿足不可重復讀、幻影行。

    很多情況都會導致事務結(jié)束,如事務的提交、回滾、執(zhí)行 DDL 語句、客戶端斷開等等。

  • 同一事務要求當前正在觀測的事務不能結(jié)束,否則該事務結(jié)束之后的操作就不能隸屬于同一事務。但這僅限于這正在被觀測的事務,其它事務是可以任意開啟、隨時結(jié)束,這不影響對同一事務的要求。


可串行化

  • 可串行化(Serializable):如果一種調(diào)度事務執(zhí)行的策略,使得每次多個事務并發(fā)執(zhí)行時,其執(zhí)行結(jié)果如果屬于下面這個執(zhí)行結(jié)果集中的任何一個結(jié)果,就認為這種調(diào)度策略滿足可串行化。

    • 任意排列這些事務的執(zhí)行次序。

    • 令這些事務依次執(zhí)行,且上一次事務執(zhí)行完,下一個事務才能執(zhí)行。

原文鏈接:https://blog.csdn.net/wangpaiblog/article/details/122780648

欄目分類
最近更新