資料庫系統概念(機械工業出版社,第六版)複習——第十二章:事務管理
第十二章 事務管理
事務定義
事務是訪問並可能更新各種資料項的一個程式執行單元。
這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。例如銀行轉賬
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完成寫階段的時間。
資料恢復
基於日誌的恢復