1. 程式人生 > >【資料庫】併發排程的可序列性

【資料庫】併發排程的可序列性

相關資料來源於網路,侵刪歉。 如果文章中存在錯誤,請下方評論告知我,謝謝!

DBMS對並行事務中各指令的安排執行(排程)是隨機的,而不同的排程可能會產生不同的結果。 將所有事務序列執行的排程策略一定是正確的排程策略。 如果錯了,一定是事務程式邏輯上的錯誤,不是因排程而產生的。 以不同的順序序列執行事務也有可能會產生不同的結果,但由於不會將資料庫置於不一致狀態,所以都可以認為是正確的。

幾個事務的並行執行是正確的,當且僅當其結果與按某一次序序列地執行它們時的結果相同(?)。當多個事務的一次併發執行效果與他們的某一種序列執行效果一樣時,稱這種併發排程策略為可序列化(Serializable)的排程。

併發事務對同一資料的讀寫次序是決定事務併發狀態下是否正確的唯一因素。

判斷能否可序列化的排程: 無論怎麼移動衝突可交換指令,都無法與某一序列化調動等價,則不能可序列化排程。

如何保證併發操作的排程是正確的 為了保證並行操作的正確性,DBMS的並行控制機制必須提供一定的手段來保證排程是可序列化的。從理論上講,在某一事務執行時禁止其他事務執行的排程策略一定是可序列化的排程,這也是最簡單的排程策略,但這種方法實際上是不可行的,因為它使使用者不能充分共享資料庫資源。

保證併發操作排程正確性的方法 封鎖方法:兩段鎖(Two-Phase Locking,簡稱2PL)協議 時標方法 樂觀方法

並行執行的所有事務均遵守兩段鎖協議,則對這些事務的所有並行排程策略都是可序列化的。即: (1)所有遵守兩段鎖協議的事務,其並行執行的結果一定是正確的。 (2)事務遵守兩段鎖協議是可序列化排程的充分條件,而不是必要條件。 (3)可序列化的排程中,不一定所有事務都必須符合兩段鎖協議。

兩段鎖協議與防止死鎖的一次封鎖法的比較: 一次封鎖法要求每個事務必須一次將所有要使用的資料全部加鎖,否則就不能繼續執行,因此一次封鎖法遵守兩段鎖協議;但是兩段鎖協議並不要求事務必須一次將所有要使用的資料全部加鎖,因此遵守兩段鎖協議的事務可能發生死鎖。

X鎖和S鎖都是加在某一個數據物件上的 封鎖的物件: 邏輯單元:屬性值、屬性值集合、元組、關係、索引項、整個索引、整個資料庫等 物理單元:頁(資料頁或索引頁)、物理記錄等 封鎖物件可以很大也可以很小。例:對整個資料庫加鎖;對某個屬性值加鎖。 封鎖物件的大小稱為封鎖的粒度(Granularity) 多粒度封鎖(multiple granularity locking) 在一個系統中同時支援多種封鎖粒度供不同的事務選擇。

封鎖的粒度

系統被封鎖的物件個數

併發度

系統開銷

選擇封鎖粒度 考慮封鎖機構和併發度兩個因素,對系統開銷與併發度進行權衡。 需要處理多個關係的大量元組的使用者事務:以資料庫為封鎖單位; 需要處理大量元組的使用者事務:以關係為封鎖單元; 只處理少量元組的使用者事務:以元組為封鎖單位。

多粒度樹:以樹形結構來表示多級封鎖粒度,根結點是整個資料庫,表示最大的資料粒度;葉結點表示最小的資料粒度。

多粒度封鎖協議 允許多粒度樹中的每個結點被獨立地加鎖 (1)對一個結點加鎖意味著這個結點的所有後裔結點也被加以同樣型別的鎖 (2)在多粒度封鎖中一個數據物件可能以兩種方式封鎖:顯式封鎖和隱式封鎖 顯式封鎖:直接加到資料物件上的封鎖 隱式封鎖: 由於其上級結點加鎖而使該資料物件加上了鎖 顯式封鎖和隱式封鎖的效果是一樣的。