【正文】
對每個REDO 事務重新執(zhí)行日志文件登記的操作。即將日志記錄中“更新后的值”Afte , Image )寫入數(shù)據(jù)庫。介質故障的恢復:介質故障是最嚴重的一種故障?;謴头椒ㄊ侵匮b數(shù)據(jù)庫,然后重做已完成的事務。具體過程是:( 1 ) DBA 裝入最新的數(shù)據(jù)庫后備副本(離故障發(fā)生時刻最近的轉儲副本), 使數(shù)據(jù)庫恢復到轉儲時的一致性狀態(tài);( 2 ) DBA 裝入轉儲結束時刻的日志文件副本;( 3 ) DBA 啟動系統(tǒng)恢復命令,由DBMS 完成恢復功能,即重做已完成的事務。10 .什么是檢查點記錄?檢查點記錄包括哪些內容?答:檢查點記錄是一類新的日志記錄。它的內容包括:① 建立檢查點時刻所有正在執(zhí)行的事務清單② 這些事務的最近一個日志記錄的地址。11 .具有檢查點的恢復技術有什么優(yōu)點?試舉一個具體的例子加以說明。答答:利用日志技術進行數(shù)據(jù)庫恢復時,恢復子系統(tǒng)必須搜索日志,確定哪些事務需要REDO ,哪些事務需要uNDO 。一般來說,需要檢查所有日志記錄。這樣做有兩個問題:一是搜索整個日志將耗費大量的時間;二是很多需要REDO 處理的事務實際上已經(jīng)將它們的更新操作結果寫到數(shù)據(jù)庫中了,恢復子系統(tǒng)又重新執(zhí)行了這些操作,浪費了大量時間。檢查點技術就是為了解決這些問題。在采用檢查點技術之前,恢復時需要從頭掃描日志文件,而利用檢查點技術只需要從T 。開始掃描日志,這就縮短了掃描日志的時間。事務Tl 的更新操作實際上已經(jīng)寫到數(shù)據(jù)庫中了,進行恢復時沒有必要再REDO 處理,采用檢查點技術做到了這一點。12 .試述使用檢查點方法進行恢復的步驟。答:(1)從重新開始文件(見第11 題的圖)中找到最后一個檢查點記錄在日志文件中的地址,由該地址在日志文件中找到最后一個檢查點記錄。(2)由該檢查點記錄得到檢查點建立時刻所有正在執(zhí)行的事務清單ACTIVE 一LIST 。這里建立兩個事務隊列:1 ) UNDO 一LIST :需要執(zhí)行undo 操作的事務集合;2 ) REDO 一LIST :需要執(zhí)行redo 操作的事務集合。把ACTIVE 一LIST 暫時放入UNDO 一LIST 隊列,REDO 隊列暫為空。3 )從檢查點開始正向掃描日志文件:① 如有新開始的事務T * ,把T *暫時放入uNDO 一LlsT 隊列;② 如有提交的事務毛,把毛從UNDO 一LIST 隊列移到REDO 一LIST 隊列,直到日志文件結束;4 )對UNDO 一LIST 中的每個事務執(zhí)行UNDO 操作,對REDO 一LIST 中的每個事務執(zhí)行REDO 操作。13 .什么是數(shù)據(jù)庫鏡像?它有什么用途?答:數(shù)據(jù)庫鏡像即根據(jù)DBA 的要求,自動把整個數(shù)據(jù)庫或者其中的部分關鍵數(shù)據(jù)復制到另一個磁盤上。每當主數(shù)據(jù)庫更新時,DBMS 自動把更新后的數(shù)據(jù)復制過去,即DBMS 自動保證鏡像數(shù)據(jù)與主數(shù)據(jù)的一致性。數(shù)據(jù)庫鏡像的用途有:一是用于數(shù)據(jù)庫恢復。當出現(xiàn)介質故障時,可由鏡像磁盤繼續(xù)提供使用,同時DBMS 自動利用鏡像磁盤數(shù)據(jù)進行數(shù)據(jù)庫的恢復,不需要關閉系統(tǒng)和重裝數(shù)據(jù)庫副本。二是提高數(shù)據(jù)庫的可用性。在沒有出現(xiàn)故障時,當一個用戶對某個數(shù)據(jù)加排它鎖進行修改時,其他用戶可以讀鏡像數(shù)據(jù)庫上的數(shù)據(jù),而不必等待該用戶釋放鎖。第11章 并發(fā)控制1. 在數(shù)據(jù)庫中為什么要并發(fā)控制?答:數(shù)據(jù)庫是共享資源,通常有許多個事務同時在運行。當多個事務并發(fā)地存取數(shù)據(jù)庫時就會產(chǎn)生同時讀取和/或修改同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就可能會存取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。所以數(shù)據(jù)庫管理系統(tǒng)必須提供并發(fā)控制機制。2 .并發(fā)操作可能會產(chǎn)生哪幾類數(shù)據(jù)不一致?用什么方法能避免各種不一致的情況?答:并發(fā)操作帶來的數(shù)據(jù)不一致性包括三類:丟失修改、不可重復讀和讀“臟’夕數(shù)據(jù)。 ( l )丟失修改(lost update ) 兩個事務 Tl 和T2讀入同一數(shù)據(jù)并修改,T2提交的結果破壞了(覆蓋了) Tl 提交的結果,導致 Tl 的修改被丟失。 ( 2 )不可重復讀( Non 一 Repeatable Read ) 不可重復讀是指事務 Tl 讀取數(shù)據(jù)后,事務幾執(zhí)行更新操作,使 Tl 無法再現(xiàn)前一次讀取結果。( 3 )讀“臟”數(shù)據(jù)( Dirty Read ) 讀“臟’夕數(shù)據(jù)是指事務 Tl 修改某一數(shù)據(jù),并將其寫回磁盤,事務幾讀取同一數(shù)據(jù)后, Tl 由于某種原因被撤銷,這時 Tl 已修改過的數(shù)據(jù)恢復原值,幾讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致,則幾讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。避免不一致性的方法和技術就是并發(fā)控制。最常用的技術是封鎖技術。也可以用其他技術,例如在分布式數(shù)據(jù)庫系統(tǒng)中可以采用時間戳方法來進行并發(fā)控制。 3 .什么是封鎖?基本的封鎖類型有幾種?試述它們的含義。答:封鎖就是事務 T 在對某個數(shù)據(jù)對象例如表、記錄等操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務 T 就對該數(shù)據(jù)對象有了一定的控制,在事務 T 釋放它的鎖之前,其他的事務不能更新此數(shù)據(jù)對象。封鎖是實現(xiàn)并發(fā)控制的一個非常重要的技術?;镜姆怄i類型有兩種:排它鎖( Exclusive Locks ,簡稱 x 鎖)和共享鎖 ( Share Locks,簡稱 S 鎖)。排它鎖又稱為寫鎖。若事務 T 對數(shù)據(jù)對象 A 加上 X 鎖,則只允許 T 讀取和修改 A ,其他任何事務都不能再對 A 加任何類型的鎖,直到 T 釋放 A 上的鎖。這就保證了其他事務在 T 釋放 A 上的鎖之前不能再讀取和修改 A 。共享鎖又稱為讀鎖。若事務 T 對數(shù)據(jù)對象 A 加上 S 鎖,則事務 T 可以讀 A但不能修改 A ,其他事務只能再對 A 加 S 鎖,而不能加 X 鎖,直到 T 釋放 A 上的 S 鎖。這就保證了其他事務可以讀 A ,但在 T 釋放 A 上的 S 鎖之前不能對 A 做任何修改。4 .如何用封鎖機制保證數(shù)據(jù)的一致性?答: DBMS 在對數(shù)據(jù)進行讀、寫操作之前首先對該數(shù)據(jù)執(zhí)行封鎖操作,例如下圖中事務 Tl 在對 A 進行修改之前先對 A 執(zhí)行 xock ( A ) ,即對 A 加 x 鎖。這樣,當幾請求對 A 加 x 鎖時就被拒絕,幾只能等待 Tl 釋放 A 上的鎖后才能獲得對 A 的 x 鎖,這時它讀到的 A 是 Tl 更新后的值,再按此新的 A 值進行運算。這樣就不會丟失 Tl 的更新。DBMS 按照一定的封鎖協(xié)議,對并發(fā)操作進行控制,使得多個并發(fā)操作有序地執(zhí)行,就可以避免丟失修改、不可重復讀和讀“臟’夕數(shù)據(jù)等數(shù)據(jù)不一致性。5 .什么是活鎖?什么是死鎖?答:如果事務 Tl 封鎖了數(shù)據(jù) R ,事務幾又請求封鎖 R ,于是幾等待。幾也請求封鎖 R ,當 Tl 釋放了 R 上的封鎖之后系統(tǒng)首先批準了幾的請求,幾仍然等待。然后幾又請求封鎖 R ,當幾釋放了 R 上的封鎖之后系統(tǒng)又批準了幾的請求 … … 幾有可能永遠等待,這就是活鎖的情形。活鎖的含義是該等待事務等待時間太長,似乎被鎖住了,實際上可能被激活。如果事務 Tl 封鎖了數(shù)據(jù) Rl ,幾封鎖了數(shù)據(jù)凡,然后 Tl 又請求封鎖幾,因幾已封鎖了幾,于是 Tl 等待幾釋放幾上的鎖。接著幾又申請封鎖 Rl ,因 Tl 已封鎖了 Rl ,幾也只能等待 Tl 釋放 Rl 上的鎖。這樣就出現(xiàn)了 Tl 在等待幾,而幾又在等待 T }的局面, T }和幾兩個事務永遠不能結束,形成死鎖。6 .試述活鎖的產(chǎn)生原因和解決方法。答:活鎖產(chǎn)生的原因:當一系列封鎖不能按照其先后順序執(zhí)行時,就可能導致一些事務無限期等待某個封鎖,從而導致活鎖。避免活鎖的簡單方法是采用先來先服務的策略。當多個事務請求封鎖同一數(shù)據(jù)對象時,封鎖子系統(tǒng)按請求封鎖的先后次序對事務排隊,數(shù)據(jù)對象上的鎖一旦釋放就批準申請隊列中第一個事務獲得鎖。11 .請給出檢測死鎖發(fā)生的一種方法,當發(fā)生死鎖后如何解除死鎖?答:數(shù)據(jù)庫系統(tǒng)一般采用允許死鎖發(fā)生, DBMS 檢測到死鎖后加以解除的方法。 DBMS 中診斷死鎖的方法與操作系統(tǒng)類似,一般使用超時法或事務等待圖法。超時法是:如果一個事務的等待時間超過了規(guī)定的時限,就認為發(fā)生了死鎖。超時法實現(xiàn)簡單,但有可能誤判死鎖,事務因其他原因長時間等待超過時限時,系統(tǒng)會誤認為發(fā)生了死鎖。若時限設置得太長,又不能及時發(fā)現(xiàn)死鎖發(fā)生。 DBMS 并發(fā)控制子系統(tǒng)檢測到死鎖后,就要設法解除。通常采用的方法是選擇一個處理死鎖代價最小的事務,將其撤消,釋放此事務持有的所有鎖,使其他事務得以繼續(xù)運行下去。當然,對撤銷的事務所執(zhí)行的數(shù)據(jù)修改操作必須加以恢復。12 .什么樣的并發(fā)調度是正確的調度?答:可串行化( Serializable )的調度是正確的調度。可串行化的調度的定義:多個事務的并發(fā)執(zhí)行是正確的,當且僅當其結果與按某一次序串行執(zhí)行它們時的結果相同,稱這種調度策略為可串行化的調度。 9 .設 Tl ,幾,幾是如下的 3 個事務: Tl :A : = A + 2 。 T2:A : = A * 2 。 T3:A : = A **2 。 ( A A*A)設 A 的初值為 0 。 ( l )若這 3 個事務允許并行執(zhí)行,則有多少可能的正確結果,請一一列舉出來。答 :A 的最終結果可能有 2 、 4 、 8 、 16 。因為串行執(zhí)行次序有 Tl T2T Tl T3TT2T1TT2T3Tl 、T3T1TT3T2 Tl 。對應的執(zhí)行結果是 16 、 8 4 2 4 2 。 ( 2 )請給出一個可串行化的調度,并給出執(zhí)行結果答: 最后結果 A 為 16 ,是可串行化的調度。 ( 3 )請給出一個非串行化的調度,并給出執(zhí)行結果。答: 最后結果 A 為 0 ,為非串行化的調度。 ( 4 )若這 3 個事務都遵守兩段鎖協(xié)議,請給出一個不產(chǎn)生死鎖的可串行化調度。答: ( 5 )若這 3 個事務都遵守兩段鎖協(xié)議,請給出一個產(chǎn)生死鎖的調度。答: 11.試證明,若并發(fā)事務遵守兩段鎖協(xié)議,則對這些事務的并發(fā)調度是可串行化的。證明:首先以兩個并發(fā)事務 Tl 和T2為例,存在多個并發(fā)事務的情形可以類推。根據(jù)可串行化定義可知,事務不可串行化只可能發(fā)生在下列兩種情況:( l )事務 Tl 寫某個數(shù)據(jù)對象 A ,T2讀或寫 A 。 ( 2 )事務 Tl 讀或寫某個數(shù)據(jù)對象 A ,T2寫 A 。下面稱 A 為潛在沖突對象。設 Tl 和T2訪問的潛在沖突的公共對象為{A1,A2 … , An }。不失一般性,假設這組潛在沖突對象中 X =(A 1 , A2 , … , Ai }均符合情況 1 。 Y ={A i + 1 , … , An }符合所情況( 2 )。 VX ∈ x , Tl 需要 XlockX ① T2 需要 Slockx 或 Xlockx ②1 )如果操作 ① 先執(zhí)行,則 Tl 獲得鎖,T2等待由于遵守兩段鎖協(xié)議, Tl 在成功獲得 x 和 Y 中全部對象及非潛在沖突對象的鎖后,才會釋放鎖。這時如果存在 w ∈ x 或 Y ,T2已獲得 w 的鎖,則出現(xiàn)死鎖;否則, Tl 在對 x 、 Y 中對象全部處理完畢后,T2才能執(zhí)行。這相當于按 Tl 、T2的順序串行執(zhí)行,根據(jù)可串行化定義, Tl 和幾的調度是可串行化的。 2 )操作 ② 先執(zhí)行的情況與( l )對稱因此,若并發(fā)事務遵守兩段鎖協(xié)議,在不發(fā)生死鎖的情況下,對這些事務的并發(fā)調度一定是可串行化的。證畢。 12 .舉例說明,對并發(fā)事務的一個調度是可串行化的,而這些并發(fā)事務不一定遵守兩段鎖協(xié)議。答:13 .為什么要引進意向鎖?意向鎖的含義是什么?答:引進意向鎖是為了提高封鎖子系統(tǒng)的效率。該封鎖子系統(tǒng)支持多種封鎖粒度。原因是:在多粒度封鎖方法中一個數(shù)據(jù)對象可能以兩種方式加鎖 ― 顯式封鎖和隱式封鎖。因此系統(tǒng)在對某一數(shù)據(jù)對象加鎖時不僅要檢查該數(shù)據(jù)對象上有無(顯式和隱式)封鎖與之沖突,還要檢查其所有上級結點和所有下級結點,看申請的封鎖是否與這些結點上的(顯式和隱式)封鎖沖突,顯然,這樣的檢查方法效率很低。為此引進了意向鎖。意向鎖的含義是:對任一結點加鎖時,必須先對它的上層結點加意向鎖。例如事務 T 要對某個元組加 X 鎖,則首先要對關系和數(shù)據(jù)庫加 ix 鎖。換言之,對關系和數(shù)據(jù)庫加 ix 鎖,表示它的后裔結點 ― 某個元組擬(意向)加 X 鎖。引進意向鎖后,系統(tǒng)對某一數(shù)據(jù)對象加鎖時不必逐個檢查與下一級結點的封鎖沖突了。例如,事務 T 要對關系 R 加 X 鎖時,系統(tǒng)只要檢查根結點數(shù)據(jù)庫和 R 本身是否已加了不相容的鎖(如發(fā)現(xiàn)已經(jīng)加了 ix ,則與 X 沖突),而不再需要搜索和檢查 R 中的每一個元組是否加了 X 鎖或 S 鎖。 14 .試述常用的意向鎖: IS 鎖、 ix 鎖、 SIX 鎖,給出這些鎖的相容矩陣。答: IS鎖:如果對一個數(shù)據(jù)對象加 IS 鎖,表示它的后裔結點擬(意向)加 S 鎖。例如,要對某個元組加 S 鎖,則要首先對關系和數(shù)據(jù)庫加 IS 鎖 IX 鎖:如果對一個數(shù)據(jù)對象加 ix 鎖,表示它的后裔結點擬(意向功口 X 鎖。例如,要對某個元組加 X 鎖,則要首先對關系和數(shù)據(jù)庫加 ix 鎖。 SIX 鎖:如果對一個數(shù)據(jù)對象加 SIX 鎖,表示對它加 S 鎖,再加 IX 鎖,即 SIX = S + IX 。相容矩陣:15 .理解并解釋下列術語的含義:封鎖、活鎖、死鎖、排它鎖、共享鎖、并發(fā)事務的調度、可串行化的調度、兩段鎖協(xié)議。答:(略,已經(jīng)在上面有關習題中解答)16 .試述你了解的某一個實際的 DBMS 產(chǎn)品的并發(fā)控制機制。答:(略,參見簡單介紹了有關 Oracle 的并發(fā)控制機制。)