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