1. 程式人生 > >資料庫系統概念(機械工業出版社,第六版)複習——第十二章:事務管理

資料庫系統概念(機械工業出版社,第六版)複習——第十二章:事務管理

第十二章 事務管理

事務定義

事務是訪問並可能更新各種資料項的一個程式執行單元。

這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。例如銀行轉賬

SQL中事務的定義

       Commitwork表示提交,事務正常結束。

       Rollbackwork表示事務非正常結束,撤消事務已完成的操作,回滾到事務開始時狀態。

Read(X) and write(X)

read(X):從資料庫傳送資料項X到事務的工作區中

write(X):從事務的工作區中將資料項X寫回資料庫

事物特性(ACID)

原子性(Atomicity)

       事務中包含的所有操作要麼全做,要麼全不做。原子性由恢復系統

實現。

一致性(Consistency)

       事務的隔離執行必須保證資料庫的一致性。事務開始前,資料庫處於一致性的狀態;事務結束後,資料庫必須仍處於一致性狀態;事務的執行過程中可以暫時的不一致。資料庫的一致性狀態由使用者來負責,由併發控制系統實現。

如銀行轉賬,轉賬前後兩個帳戶金額之和應保持不變。

隔離性(Isolation)

       系統必須保證事務不受其它併發執行事務的影響。對任何一對事務T1,T2,在T1看來,T2要麼在T1開始之前已經結束,要麼在T1完成之後再開始執行。隔離性通過併發控制系統實現。

永續性(Durability)

       一個事務一旦提交之後,它對資料庫的影響必須是永久的。系統發生故障不能改變事務的永續性。永續性通過恢復系統

實現。

事務狀態圖

並行VS序列

基本比較:

並行事務會破壞資料庫的一致性,序列事務效率低。

並行的優點:

一個事務由不同的步驟組成,所涉及的系統資源也不同。這些步驟可以併發執行,以提高系統的吞吐量(throughput)

系統中存在著週期不等的各種事務,序列會導致難於預測的延遲。如果各個事務所涉及的是資料庫的不同部分,採用並行會減少平均響應時間(average response time)

核心問題:

       在保證一致性的前提下最大限度地提高併發度。

併發操作帶來的資料不一致性

丟失修改(lost update)

不可重複讀(non-repeatable read)

讀“髒”資料(dirty read)

丟失資料

事務1與事務2從資料庫中讀入同一資料並修改,事務2的提交結果破壞了事務1提交的結果,導致事務1的修改被丟失。

不可重複讀

事務1讀取資料後,事務2執行更新操作,使事務1無法再現前一次讀取結果。

三類不可重複讀:

事務1讀取某一資料後:

1.事務2對其做了修改,當事務1再次讀該資料時,得到與前一次不同的值。

2.事務2刪除了其中部分記錄,當事務1再次讀取資料時,發現某些記錄神祕地消失了。

3.事務2插入了一些記錄,當事務1再次按相同條件讀取資料時,發現多了一些記錄。

後兩種不可重複讀有時也稱為幻影現象(phantomrow)。

讀“髒”資料

事務1修改某一資料,並將其寫回磁碟,事務2讀取同一資料後,事務1由於某種原因被撤消,這時事務1已修改過的資料恢復原值,事務2讀到的資料就與資料庫中的資料不一致,是不正確的資料,又稱為“髒”資料。

事務排程

事務的執行順序稱為一個排程(schedule),表示事務的指令在系統中執行的時間順序。

當並行排程等價於某個序列排程時,則稱它是正確的。

衝突可序列化

衝突指令:

當兩條指令是不同事務相同資料項上的操作,並且其中至少有一個是write指令時,則稱這兩條指令是衝突的。

衝突等價:

       如果排程S可以經過一系列非衝突指令交換轉換成排程S',則稱排程S與S'是衝突等價的(conflictequivalent)。

衝突可序列化:

       當一個排程S與一個序列排程衝突等價時,則稱該排程S是衝突可序列化的(conflict serializable)。

衝突可序列化判定:優先圖。

可恢復排程(Recoverable Schedule)

事務的恢復:

一個事務失敗了,應該能夠撤消該事務對資料庫的影響。如果有其它事務讀取了失敗事務寫入的資料,則該事務也應該撤消。

可恢復排程:

對於每對事務T1與T2,如果T2讀取了T1所寫的資料,則T1必須先於T2提交。

無級聯排程

級聯排程:

由於一個事務故障而導致一系列事務回滾。

無級聯排程:

對於每對事務T1與T2,如果T2讀取了T1所寫的資料,則T1必須在T2讀取之前提交。

<注>無級聯排程必是可恢復排程

事務隔離性

按照隔離級別從低到高的順序:

未提交讀:允許讀取未提交資料。(當事務A更新某條資料時,不容許其他事務來更新該資料,但可以讀取。)

已提交讀:只允許讀取已提交資料,但不要求可重複讀。(當事務A更新某條資料時,不容許其他事務進行任何操作包括讀取,但事務A讀取時,其他事務可以進行讀取、更新。)

可重複讀:只允許讀取已提交資料,而且一個事務兩次讀取一個數據項期間,其他事務不得更新該資料,但是該事務不要求與其他事務可序列化。

可序列化:保證可序列化排程。

隔離級別

骯髒讀取

不可重複讀取

幻象讀取

未授權讀取

可能發生

可能發生

可能發生

授權讀取

-

可能發生

可能發生

可重複讀取

-

-

可能發生

可序列化

-

-

-

併發機制

併發控制機制的任務:對併發操作進行正確排程、保證事務的隔離性、保證資料庫的一致性。

基本封鎖型別:

排它鎖(exclusive lock,簡記為X鎖)

共享鎖(Share lock,簡記為S鎖)

共享鎖

共享鎖又稱為讀鎖。若事務T對資料物件Q加上S鎖,事務T可讀但不能寫Q,其它事務只能再對Q加S鎖,而不能加X鎖,直到T釋放Q上的S鎖。

排它鎖

排它鎖又稱為寫鎖。若事務T對資料物件Q加上X鎖,則事務T既可以讀又可以寫Q,其它任何事務都不能再對Q加任何型別的鎖,直到T釋放A上的鎖。

死鎖

活鎖(餓死)

飢餓/餓死:

不斷出現的申請並獲得S鎖的事務,使申請X鎖的事務一直處在等待狀態。

飢餓的防止:

對申請S鎖的事務,如果有先於該事務且等待的加X鎖的事務,令申請S鎖的事務等待。

保證可序列性的封鎖協議(兩階段封鎖協議)

定義:每個事務分兩個階段提出加鎖和解鎖申請。

增長階段(growing phase):事務可以獲得鎖,但不能釋放鎖。

縮減階段(shrinking phase):事務可以釋放鎖,但不能獲得新鎖。

封鎖點(lock point):事務最後加鎖的位置,稱為事務的封鎖點, 記作Lp(T)。

並行執行的所有事務均遵守兩段鎖協議,則對這些事務的所有並行排程策略都是可序列化的。所有遵守兩段鎖協議的事務,其並行執行的結果一定是正確的。

事務遵守兩段鎖協議是可序列化排程的充分條件,而不是必要條件。可序列化的排程中,不一定所有事務都必須符合兩段鎖協議。

兩階段封鎖協議不保證不會發生死鎖。

嚴格兩階段封鎖協議:除了要求封鎖是兩階段之外,還要求事務持有的所有排他鎖必須在事務結束後,方可釋放。

強兩階段封鎖協議:事務提交之前,不得釋放任何鎖。在強兩階段封鎖協議下,事務可以按其結束的順序序列化。

鎖轉換

Upgrade:從共享鎖提升為排他鎖

Downgrade:從排他鎖降級為共享鎖

鎖升級只能發生在增長階段,鎖降級只能發生在縮減階段。

多粒度封鎖的必要性

事務訪問資料的粒度不同

DB、Table、Tuple、…

單一封鎖粒度的問題

封鎖粒度大:併發性低

封鎖粒度小:訪問大粒度資料加鎖量巨大

多粒度封鎖

根據訪問資料的粒度,確定封鎖的粒度

以求加鎖量有限,並可獲得最大的併發性

多粒度封鎖的基本原則

大粒度資料由小粒度資料組成;

允許對不同粒度資料進行封鎖;

事務對大粒度資料加鎖,隱含地對組成大粒度資料的所有小粒度資料加鎖。

多粒度層次結構

多粒度層次樹,子節點表示的資料是父節點表示資料的一部分。

意向鎖(intention lock mode)

如果一個節點加上了意向鎖,則意味著要在樹的較低層進行顯示加鎖。

在一個節點顯式加鎖之前,該結點的全部祖先均加上了意向鎖。

事務判定是否能夠成功地給一個結點加鎖時,不必搜尋整棵樹。

多粒度封鎖相容矩陣

共享意向鎖(IS)/排他意向鎖(IX)/共享排他意向鎖(SIX)

多粒度封鎖協議

遵從鎖的相容矩陣;

根結點必須首先加鎖,可以加任何型別的鎖;

僅當Ti對Q的父結點持有IX或IS鎖時,Ti對於結點Q加S或者Is鎖;

僅當Ti對Q的父結點持有IX或SIX鎖時, Ti對於結點Q加X、SIX、IX鎖;

僅當Ti未曾對任何結點解鎖時,Ti可以對結點加鎖(兩階段的);

僅當Ti當前不持有Q的子節點的鎖時,Ti可以對節點Q解鎖。

特點:

增加了併發行,減少了鎖開銷。

適應範圍:

只存取幾個資料項的短事務,

由整個檔案或一組檔案形成報表的長事務。

基於時間戳的協議

時間戳排序協議的目標:

令排程衝突等價於按照事務開始早晚次序排序的序列排程。

時間戳排序協議的基本思想:

開始早的事務不能讀開始晚的事務寫的資料;

開始早的事務不能寫開始晚的事務已經讀過或寫過的資料。

資料項時間戳

W-timestamp(Q):表示成功執行write(Q)的所有事務的最大的時間戳。

R-timestamp(Q):表示成功執行read(Q)的所有事務的最大的時間戳。

注意:不是最後執行Read(Q)的事務的時間戳

例如:TS(T1)=1;TS(T2)=2;

               T2:read(Q)  //r-ts(Q)=2

               T1:read(Q)  //r-ts(Q)=2  (≠1!)

時間戳排序協議性質和特點

保證衝突可序列化;

衝突可序列化的排程不一定能被時間戳排序協議排程出來;

無死鎖;

存在飢餓/餓死現象(事務可能被反覆回滾、重啟);

不能保證可恢復性(可以擴充套件協議以保證可恢復性,如跟蹤提交依賴等)。

Tomas寫規則

基於有效性檢查的協議

每個事務Ti在其生存期中按兩個或三個階段執行:

1、讀階段:各資料項值被讀入,並儲存在事物Ti的區域性變數中。

2、有效性檢查階段:判斷是否可以將write操作所更新的臨時區域性變數值複製到資料庫而不違反可序列性。

3、寫階段:若事務Ti已經通過有效性檢查,進行實際的資料庫更新,否則,回滾。

為了進行有效性檢測測試,需要知道事務Ti的各個階段何時進行,設立三個時間戳:

1、Start(Ti):事務Ti開始執行的時間。

2、Validation(Ti):事務Ti完成讀階段並開始其有效性檢查階段的時間。

3、Finish(Ti):事務Ti完成寫階段的時間。

資料恢復

基於日誌的恢復