版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)庫是一個共享資源,可以提供多個用戶使用。這些用戶程序可以一個一個地串行執(zhí)行, 每個時刻只有一個用戶程序運行, 執(zhí)行對數(shù)據(jù)庫的存取, 其他用戶程序必須等到這個用戶程 序結(jié)束以后方能對數(shù)據(jù)庫存取。但是如果一個用戶程序涉及大量數(shù)據(jù)的輸入/輸出交換,則數(shù)據(jù)庫系統(tǒng)的大部分時間處于閑置狀態(tài)。 因此, 為了充分利用數(shù)據(jù)庫資源, 發(fā)揮數(shù)據(jù)庫共享 資源的特點, 應(yīng)該允許多個用戶并行地存取數(shù)據(jù)庫。 但這樣就會產(chǎn)生多個用戶程序并發(fā)存取 同一數(shù)據(jù)的情況, 若對并發(fā)操作不加控制就可能會存取和存儲不正確的數(shù)據(jù), 破壞數(shù)據(jù)庫的 一致性, 所以數(shù)據(jù)庫管理系統(tǒng)必須提供并發(fā)控制機制。 并發(fā)控制機制的好壞是衡量一個數(shù)據(jù) 庫管理
2、系統(tǒng)性能的重要標(biāo)志之一。DM 用封鎖機制來解決并發(fā)問題。它可以保證任何時候都可以有多個正在運行的用戶程序, 但是所有用戶程序都在彼此完全隔離的環(huán)境中運行。一、 并發(fā)控制的預(yù)備知識(一 ) 并發(fā)控制概述并發(fā)控制是以事務(wù)( transaction )為單位進行的。1. 并發(fā)控制的單位 事務(wù)事務(wù)是數(shù)據(jù)庫的邏輯工作單位,它是用戶定義的一組操作序列。一個事務(wù)可以是一組 SQL 語句、一條 SQL 語句或整個程序。事務(wù)的開始和結(jié)束都可以由用戶顯示的控制, 如果用戶沒有顯式地定義事務(wù), 則由數(shù)據(jù)庫系 統(tǒng)按缺省規(guī)定自動劃分事務(wù)。事務(wù)應(yīng)該具有 4 種屬性:原子性、一致性、隔離性和持久性。(1)原子性事務(wù)的原子性
3、保證事務(wù)包含的一組更新操作是原子不可分的,也就是說這些操作是一個整 體,對數(shù)據(jù)庫而言全做或者全不做, 不能部分的完成。 這一性質(zhì)即使在系統(tǒng)崩潰之后仍能得 到保證, 在系統(tǒng)崩潰之后將進行數(shù)據(jù)庫恢復(fù), 用來恢復(fù)和撤銷系統(tǒng)崩潰處于活動狀態(tài)的事務(wù) 對數(shù)據(jù)庫的影響, 從而保證事務(wù)的原子性。 系統(tǒng)對磁盤上的任何實際數(shù)據(jù)的修改之前都會將 修改操作信息本身的信息記錄到磁盤上。 當(dāng)發(fā)生崩潰時, 系統(tǒng)能根據(jù)這些操作記錄當(dāng)時該事 務(wù)處于何種狀態(tài), 以此確定是撤銷該事務(wù)所做出的所有修改操作, 還是將修改的操作重新執(zhí) 行。(2)一致性一致性要求事務(wù)執(zhí)行完成后, 將數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)變到另一個一致狀態(tài)。 它是一種以
4、一致性規(guī)則為基礎(chǔ)的邏輯屬性, 例如在轉(zhuǎn)賬的操作中, 各賬戶金額必須平衡, 這一條規(guī)則對 于程序員而言是一個強制的規(guī)定, 由此可見, 一致性與原子性是密切相關(guān)的。 事務(wù)的一致性 屬性要求事務(wù)在并發(fā)執(zhí)行的情況下事務(wù)的一致性仍然滿足。 它在邏輯上不是獨立的, 它由事 務(wù)的隔離性來表示。(3 ) 隔離性隔離性意味著一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。 即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對 并發(fā)的其他事務(wù)是隔離的, 并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。 它要求即使有多個事務(wù) 并發(fā)執(zhí)行,看上去每個成功事務(wù)按串行調(diào)度執(zhí)行一樣。這一性質(zhì)的另一種稱法為可串行性, 也就是說系統(tǒng)允許的任何交錯操作調(diào)度等價于一個串行調(diào)度
5、。 串行調(diào)度的意思是每次調(diào)度一 個事務(wù),在一個事務(wù)的所有操作沒有結(jié)束之前,另外的事務(wù)操作不能開始。由于性能原因, 我們需要進行交錯操作的調(diào)度, 但我們也希望這些交錯操作的調(diào)度的效果和某一個串行調(diào)度 是一致的。 DM 實現(xiàn)該機制是通過對事務(wù)的數(shù)據(jù)訪問對象加適當(dāng)?shù)逆i,從而排斥其他的事 務(wù)對同一數(shù)據(jù)庫對象的并發(fā)操作。(4)持久性系統(tǒng)提供的持久性保證要求一旦事務(wù)提交, 那么對數(shù)據(jù)庫所做的修改將是持久的, 無論發(fā)生 何種機器和系統(tǒng)故障都不應(yīng)該對其有任何影響。例如,自動柜員機(ATM )在向客戶支付一筆錢時, 就不用擔(dān)心丟失客戶的取款記錄。 事務(wù)的持久性保證事務(wù)對數(shù)據(jù)庫的影響是持久 的,即使系統(tǒng)崩潰。正如
6、在講原子性時所提到的那樣,系統(tǒng)通過做記錄來提供這一保證。DM 沒有提供顯式定義事務(wù)開始的語句,第一個可執(zhí)行的SQL 語句 (除 CONNECT 語句外 )隱含事務(wù)的開始, 但事務(wù)的結(jié)束可以由用戶顯式的控制。 在 DM 中以下幾種情況都結(jié)束 (正 常,非正常 )某一事務(wù):(1)當(dāng)某一連接的屬性設(shè)置為自動提交,每執(zhí)行一條語句都會提交;2 )遇到 COMMIT/ROLLBACK 語句,便提交 /回滾一事務(wù);(3 )當(dāng)系統(tǒng)的 DDL 自動提交開關(guān)打開時(缺省為打開),遇到 DDL 語句則自動提交該 DDL 語句和以前的 DML 和 DDL 操作;(4)事務(wù)所在的程序正常結(jié)束和用戶退出;(5)系統(tǒng)非正常
7、終止時;說明:DM 在配置文件中提供了 DDL 語句的自動提交開關(guān) DDL_AUTO_COMMIT 。 當(dāng)此配 置項的值為 1(缺省情況)時,所有 DDL 語句自動提交;當(dāng)此配置項的值為 0 時,除 CREATEDATABASE 、 ALTERDATABASE 和 CREATESCHEMA 語句外的所有 DDL 語句 都不自動提交。DM 中的一致性是以事務(wù)為基礎(chǔ)的。 DM 通過提交和回滾分別用于將對數(shù)據(jù)庫的修改永久化 和廢除,但是無論是提交和回滾, DM 保證數(shù)據(jù)庫在每個事務(wù)開始前、結(jié)束后是一致的。為 了提高事務(wù)管理的靈活性, DM 提供了設(shè)置保存點( SAVEPOINT )語句和回滾到保存點
8、語 句。保存點提供了一種靈活的回滾, 事務(wù)在執(zhí)行中可以回滾到某個保存點, 在該保存點以前 的操作有效,而以后的操作被回滾掉。DM 中的事務(wù)同樣具有上述 4 個屬性:原子性、一致性、隔離性和持久性。2. 并發(fā)操作與數(shù)據(jù)的不一致性如果沒有鎖定且多個用戶同時訪問一個數(shù)據(jù)庫, 則當(dāng)他們的事務(wù)同時使用相同的數(shù)據(jù)時可能 會發(fā)生問題,導(dǎo)致數(shù)據(jù)庫中的數(shù)據(jù)的不一致性。一個最常見的并發(fā)操作的例子是火車/飛機訂票系統(tǒng)中的訂票操作。例如,在該系統(tǒng)中的一個活動序列: 甲售票員讀出某航班的機票張數(shù)余額 A ,設(shè) A=16 ; 乙售票員讀出同一航班的機票張數(shù)余額A,也是 16 ; 甲售票員賣出一張機票,修改機票張數(shù)余額 A
9、=A-1=15, 把 A 寫回數(shù)據(jù)庫; 乙售票員也賣出一張機票,修改機票張數(shù)余額 A=A-1=15, 把 A 寫回數(shù)據(jù)庫。結(jié)果明明賣出兩張機票,數(shù)據(jù)庫中機票余額只減少1。這種情況稱為數(shù)據(jù)庫的不一致性。 這種不一致性是由甲、 乙兩個售票員并發(fā)操作引起的。 在 并發(fā)操作情況下,對甲、 乙兩個事務(wù)操作序列的調(diào)度是隨機的。若按上面的調(diào)度序列行,甲事務(wù)的修改就被丟失。這是由于第 4 步中乙事務(wù)修改 A 并寫回覆蓋了甲事務(wù)的修改。 并發(fā)操作帶來的數(shù)據(jù)庫不一致性可以分為四類: 丟失或覆蓋更新、 臟讀、 不可重復(fù)讀和幻像 讀,上例只是并發(fā)問題的一種。( 1) 丟失或覆蓋更新( lostupdate )當(dāng)兩個或
10、多個事務(wù)選擇同一數(shù)據(jù), 并且基于最初選定的值更新該數(shù)據(jù)時, 會發(fā)生丟失更新問 題。每個事務(wù)都不知道其它事務(wù)的存在。 最后的更新將重寫由其它事務(wù)所做的更新, 這將導(dǎo) 致數(shù)據(jù)丟失。 上面預(yù)定飛機票的例子就屬于這種并發(fā)問題。 事務(wù) 1與事務(wù) 2 先后讀入同一數(shù)據(jù) A=16,事務(wù) 1執(zhí)行 A-1,并將結(jié)果 A=15寫回,事務(wù) 2 執(zhí)行 A-1 ,并將結(jié)果 A=15寫回。事 務(wù) 2 提交的結(jié)果覆蓋了事務(wù) 1 對數(shù)據(jù)庫的修改,從而使事務(wù) 1 對數(shù)據(jù)庫的修改丟失了。(2 ) 臟讀 一個事務(wù)讀取了另一個未提交的并行事務(wù)寫的數(shù)據(jù)。 當(dāng)?shù)诙€事務(wù)選擇其它事務(wù)正在更新的 行時,會發(fā)生未確認的相關(guān)性問題。 第二個事務(wù)
11、正在讀取的數(shù)據(jù)還沒有確認并且可能由更新 此行的事務(wù)所更改。換句話說,當(dāng)事務(wù) 1 修改某一數(shù)據(jù),并將其寫回磁盤,事務(wù) 2 讀取同 一數(shù)據(jù)后,事務(wù) 1 由于某種原因被撤銷,這時事務(wù) 1 已修改過的數(shù)據(jù)恢復(fù)原值,事務(wù) 2 讀 到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致,是不正確的數(shù)據(jù),稱為臟讀。例如,在下圖中,事務(wù) 1 將 C 值修改為 200 ,事務(wù) 2 讀到 C 為 200 ,而事務(wù) 1由于某種原 因撤銷,其修改作廢, C恢復(fù)原值 100 ,這時事務(wù) 2 讀到的就是不正確的 “臟“數(shù)據(jù)了。(3 ) 不可重復(fù)讀( nonrepeatable read ) 一個事務(wù)重新讀取前面讀取過的數(shù)據(jù), 發(fā)現(xiàn)該數(shù)據(jù)已經(jīng)被
12、另一個已提交的事務(wù)修改過。 即事 務(wù) 1 讀取某一數(shù)據(jù)后,事務(wù) 2 對其做了修改,當(dāng)事務(wù) 1 再次讀數(shù)據(jù)時,得到的與第一次不 同的值。例如,在下圖中,事務(wù) 1 讀取 B=100 進行運算,事務(wù) 2 讀取同一數(shù)據(jù) B,對其進行修改后 將 B=200 寫回數(shù)據(jù)庫。事務(wù) 1 為了對讀取值校對重讀 B,B 已為 200 ,與第一次讀取值不 一致。(4 ) 幻像讀 如果一個事務(wù)在提交查詢結(jié)果之前, 另一個事務(wù)可以更改該結(jié)果, 就會發(fā)生這種情況。 這句 話也可以這樣解釋,事務(wù) 1 按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后未提交查詢結(jié)果, 事務(wù) 2 刪除了其中部分記錄,事務(wù) 1 再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)
13、某些記錄神秘地消 失了;或者事務(wù) 1按一定條件從數(shù)據(jù)庫中讀取某些數(shù)據(jù)記錄后未提交查詢結(jié)果,事務(wù) 2 插 入了一些記錄,當(dāng)事務(wù) 1 再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)多了一些記錄。 產(chǎn)生上述四類數(shù)據(jù)不一致性的主要原因是并發(fā)操作破壞了事務(wù)的隔離性。 并發(fā)控制就是要用 正確的方式調(diào)度并發(fā)操作, 使一個用戶事務(wù)的執(zhí)行不受其他事務(wù)的干擾, 從而避免造成數(shù)據(jù) 的不一致性。3. 并發(fā)場景列舉結(jié)合 SQL 語句,列舉各種并發(fā)情況(包括可能導(dǎo)致數(shù)據(jù)不一致性和對數(shù)據(jù)一致性不產(chǎn)生影 響的情況) 。A 表示某一條數(shù)據(jù), b 和 c 都表示滿足某一個標(biāo)準(zhǔn)的兩條或多條數(shù)據(jù),表示 “非的意思,表示屬于或包含于的意思, 1 表示
14、第一個事務(wù), 2 表示第二個事務(wù)。(二 ) 并發(fā)操作的調(diào)度 計算機系統(tǒng)對并行事務(wù)中并行操作的調(diào)度是隨機的,而不同的調(diào)度可能會產(chǎn)生不同的結(jié)果, 那么哪個結(jié)果是正確的,哪個是不正確的呢? 如果一個事務(wù)運行過程中沒有其他事務(wù)在同時運行, 也就是說沒有受到其他事務(wù)的干擾, 那 么就可能認為該事務(wù)的運行結(jié)果是正常的或者預(yù)想的, 因此將所有事務(wù)串行起來的調(diào)度策略 是正確的調(diào)度策略。 雖然以不同的順序串行執(zhí)行事務(wù)也可能會產(chǎn)生不同的結(jié)果, 但由于不會 將數(shù)據(jù)庫置于不一致狀態(tài), 所以都可以認為是正確的。 由此可以得到如下結(jié)論: 幾個事務(wù)的 并行執(zhí)行是正確的, 當(dāng)且僅當(dāng)其結(jié)果與按某一次序串行地執(zhí)行它們的結(jié)果相同。
15、 我們稱這種 并行調(diào)度策略為可串行化( serializable )的調(diào)度??纱行裕?serializability )是并行事務(wù)正 確性的唯一準(zhǔn)則。例如,現(xiàn)在有兩個事務(wù),分別包含下列操作:事務(wù) 1:讀 B ; A=B+1 ;寫回 A;事務(wù) 2:讀 A ; B=A+1 ;寫回 B;假設(shè) A 的初值為 10,B 的初值為 2。下圖給出了對這兩個事務(wù)的三種不同的調(diào)度策略,( a)和( b)為兩種不同的串行調(diào)度策略,雖然執(zhí)行結(jié)果不同,但他們都是正確的調(diào)度。(c)中兩個事務(wù)是交錯執(zhí)行的,由于執(zhí)行結(jié)果與( a )、( b )的結(jié)果都不同,所以是錯誤的調(diào) 度。( d)中的兩個事務(wù)也是交錯執(zhí)行的,由于執(zhí)行
16、結(jié)果與串行調(diào)度1(圖( a )的執(zhí)行結(jié)果相同,所以是正確的調(diào)度。為了保證并行操作的正確性, DBMS 的并行控制機制必須提供一定的手段來保證調(diào)度是可 串行化的。從理論上講, 在某一事務(wù)執(zhí)行時禁止其他事務(wù)執(zhí)行的調(diào)度策略一定是可串行化的調(diào)度, 這也 是最簡單的調(diào)度策略, 但這種方法實際上是不可行的, 因為它使用戶不能充分共享數(shù)據(jù)庫資 源。目前 DBMS 普遍采用封鎖方法(悲觀方法, DM 采用的就是這種方法, SQL Server 也是采 用的這種方法) 來保證調(diào)度的正確性; 即保證并行操作調(diào)度的可串行性。 除此之外還有其他 一些方法,如時標(biāo)方法、樂觀方法等。? 悲觀并發(fā)控制 鎖定系統(tǒng)阻止用戶以影
17、響其它用戶的方式修改數(shù)據(jù)。如果用戶執(zhí)行的操作導(dǎo)致應(yīng)用了某個 鎖,則直到這個鎖的所有者釋放該鎖, 其它用戶才能執(zhí)行與該鎖沖突的操作。 該方法主要用 在數(shù)據(jù)爭奪激烈的環(huán)境中, 以及出現(xiàn)并發(fā)沖突時用鎖保護數(shù)據(jù)的成本比回滾事務(wù)的成本低的 環(huán)境中,因此稱該方法為悲觀并發(fā)控制。? 樂觀并發(fā)控制在樂觀并發(fā)控制中, 用戶讀數(shù)據(jù)時不鎖定數(shù)據(jù)。在執(zhí)行更新時,系統(tǒng)進行檢查,查看另一個 用戶讀過數(shù)據(jù)后是否更改了數(shù)據(jù)。 如果另一個用戶更新了數(shù)據(jù), 將產(chǎn)生一個錯誤。 一般情況 下,接收錯誤信息的用戶將回滾事務(wù)并重新開始。 該方法主要用在數(shù)據(jù)爭奪少的環(huán)境內(nèi), 以 及偶爾回滾事務(wù)的成本超過讀數(shù)據(jù)時鎖定數(shù)據(jù)的成本的環(huán)境內(nèi), 因
18、此稱該方法為樂觀并發(fā)控 制。? 時標(biāo)并發(fā)控制 時標(biāo)和封鎖技術(shù)之間的基本區(qū)別是封鎖是使一組事務(wù)的并發(fā)執(zhí)行 (即交叉執(zhí)行) 同步, 使用 它等價于這些事務(wù)的某一串行操作; 時標(biāo)法也是使用一組事務(wù)的交叉執(zhí)行同步, 但是使它等 價于這些事務(wù)的一個特定的串行執(zhí)行,即由時標(biāo)的時序所確定的一個執(zhí)行。如果發(fā)生沖突, 是通過撤銷并重新啟動一個事務(wù)解決的。事務(wù)重新啟動,則賦予新的時標(biāo)。(三 ) 封鎖 封鎖是事項并發(fā)控制的一個非常重要的技術(shù)。所謂封鎖就是事務(wù)T 在對某個數(shù)據(jù)對象,例如,在標(biāo)、記錄等操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務(wù)T 就對數(shù)據(jù)庫對象有了一定的控制,在事務(wù) T 釋放它的鎖之前,其他事務(wù)不
19、能更新此數(shù)據(jù)對象。1. 封鎖類型DBMS 通常提供了多種數(shù)據(jù)類型的封鎖。一個事務(wù)對某個數(shù)據(jù)對象加鎖后究竟擁有什么樣 的控制是由封鎖類型決定的?;镜姆怄i類型有兩種:排他鎖( exclusive lock ,簡記為 X 鎖)和共享鎖( share lock 簡記為 S 鎖)排他鎖又稱為寫鎖。若事務(wù) T 對數(shù)據(jù)對象 A 加上 X 鎖,則只允許 T 讀取和修改 A ,其他任 何事務(wù)都不能再對 A 加任何類型的鎖,直到 T 釋放 A 上的鎖。這就保證了其他事務(wù)在 T 釋 放 A 上的鎖之前不能再讀取和修改 A 。共享鎖又稱為讀鎖。若事務(wù) T 對數(shù)據(jù)對象 A 加上 S 鎖,則其他事務(wù)只能再對 A 加 S
20、 鎖,而 不能加 X 鎖,直到 T 釋放 A 上的鎖。這就保證了其他事務(wù)可以讀 A ,但在 T 釋放 A 上的 S 鎖之前不能對 A 做任何修改。排他鎖與共享鎖的控制方式可以用下圖的相容矩陣來表示。 在下圖的封鎖類型相容矩陣中, 最左邊一列表示事務(wù) T1 已經(jīng)獲得的數(shù)據(jù)對象上的鎖的類型, 其中橫線表示沒有加鎖。 最上面一行表示另一事務(wù) T2 對同一數(shù)據(jù)對象發(fā)出的封鎖請求。 T2 的封鎖請求能否被滿足用 Y 和 N 表示,其中 Y 表示事務(wù) T2 的封鎖要求與 T1 已持有的鎖相 容,封鎖請求可以滿足。 N 表示 T2 的封鎖請求與 T1 已持有的鎖沖突, T2 請求被拒絕。2. 封鎖粒度X 鎖
21、和 S 鎖都是加在某一個數(shù)據(jù)對象上的。封鎖的對象可以是邏輯單元,也可以是物理單 元。例如,在關(guān)系數(shù)據(jù)庫中,封鎖對象可以是屬性值、屬性值集合、元組、關(guān)系、索引項、 整個索引、整個數(shù)據(jù)庫等邏輯單元;也可以是頁(數(shù)據(jù)頁或索引頁)、塊等物理單元。封鎖 對象可以很大, 比如對整個數(shù)據(jù)庫加鎖, 也可以很小,比如只對某個屬性值加鎖。 封鎖對象 封鎖粒度與系統(tǒng)的并發(fā)度和并發(fā)控制的開銷密切相關(guān)。 封鎖的粒度越大, 系統(tǒng)中能夠被封鎖 的對象就越小,并發(fā)度也就越小,但同時系統(tǒng)開銷也越?。幌喾?,封鎖的粒度越小,并發(fā)度 越高,但系統(tǒng)開銷也就越大。因此,如果在一個系統(tǒng)中同時存在不同大小的封鎖單元供不同的事務(wù)選擇使用是比較
22、理想 的。而選擇封鎖粒度時必須同時考慮封鎖機構(gòu)和并發(fā)度兩個因素, 對系統(tǒng)開銷與并發(fā)度進行 權(quán)衡,以求得最優(yōu)的效果。 一般說來, 需要處理大量元組的用戶事務(wù)可以以關(guān)系為封鎖單元; 需要處理多個關(guān)系的大量元組的用戶事務(wù)可以以數(shù)據(jù)庫為封鎖單位; 而對于一個處理少量元 組的用戶事務(wù),可以以元組為封鎖單位以提高并發(fā)度。3. 封鎖協(xié)議封鎖的目的是為了保證能夠正確地調(diào)度并發(fā)操作。為此,在運用 X 鎖和 S 鎖這兩種基本封 鎖,對一定粒度的數(shù)據(jù)對象加鎖時,還需要約定一些規(guī)則,例如,應(yīng)何時申請X 鎖或 S 鎖、持鎖時間、何時釋放等。我們稱這些規(guī)則為封鎖協(xié)議( locking protocol )。對封鎖方式規(guī)定
23、 不同的規(guī)則, 就形成了各種不同的封鎖協(xié)議, 它們分別在不同的程度上為并發(fā)操作的正確調(diào) 度提供一定的保證。 本節(jié)介紹保證數(shù)據(jù)一致性的三級封鎖協(xié)議和保證并行調(diào)度可串行性的兩 段鎖協(xié)議,下一節(jié)將介紹避免死鎖的封鎖協(xié)議。(5) 保證數(shù)據(jù)一致性的封鎖協(xié)議 三級封鎖協(xié)議對并發(fā)操作的不正確調(diào)度可能會帶來四種數(shù)據(jù)不一致性: 丟失或覆蓋更新、 臟讀、 不可重復(fù) 讀和幻想讀。三級封鎖協(xié)議分別在不同程度上解決了這一問題。 1 級封鎖協(xié)議1 級封鎖協(xié)議的內(nèi)容是:事務(wù) T 在修改數(shù)據(jù) R 之前必須先對其加 X 鎖,直到事務(wù)結(jié)束才釋 放。事務(wù)結(jié)束包括正常結(jié)束( commit )和非正常結(jié)束( rollback )。1
24、級封鎖協(xié)議可以防止丟失或覆蓋更新,并保證事務(wù) T 是可以恢復(fù)的。例如,下圖使用 1 級封鎖協(xié)議解決了定飛機票例子的丟失更新問題。圖中,事務(wù) 1 在讀 A 進行修改之前先對 A 加 X 鎖,當(dāng)事務(wù) 2 再請求對 A 加 X 鎖時被拒絕, 只能等事務(wù) 1 釋放 A 上的鎖。事務(wù) 1 修改值 A=15 寫回磁盤,釋放 A 上的 X 鎖后,事務(wù) 2 獲得對 A 的 X 鎖,這時他讀到的 A 已經(jīng)是事務(wù) 1 更新過的值 15 ,再按此新的 A 值進行運 算,并將結(jié)果值 A=14 回到磁盤。這樣就避免了丟失事務(wù) 1 的更新。在 1 級封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對其進行修改,是不需要加鎖的,所以它不能保
25、 證可重復(fù)讀和臟讀。 2 級封鎖協(xié)議2 級封鎖協(xié)議的內(nèi)容是: 1 級封鎖協(xié)議加上事務(wù) T 在讀取數(shù)據(jù) R 之前必須先對其加 S 鎖, 讀完后即可釋放 S 鎖。2 級封鎖協(xié)議除防止了丟失或覆蓋更新,還可進一步防止臟讀。例如,下圖使用 2 級封鎖協(xié) 議解決了臟讀的問題。|下圖中,事務(wù) 1 在對 C 進行修改之前,先對 C 加 X 鎖,修改其值后寫回磁盤。這時事務(wù) 2 請求 C 加上 S 鎖,因 T1 已在 C 上加了 X 鎖,事務(wù) 2 只能等待事務(wù) 1 釋放它。之后事務(wù) 1 因某種原因被撤銷, C 恢復(fù)為原值 100 ,并釋放 C 上的 X 鎖。事務(wù) 2獲得 C 上的 S 鎖,讀 C=100 。這
26、就避免了事務(wù) 2 臟讀數(shù)據(jù)。在 2 級封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S 鎖,所以它不能保證可重復(fù)讀。 3 級封鎖協(xié)議3 級封鎖協(xié)議的內(nèi)容是: 1 級封鎖協(xié)議加上事務(wù) T 在讀取數(shù)據(jù)之前必須先對其加 S 鎖,直到 事務(wù)結(jié)束才釋放。3 級封鎖協(xié)議除防止丟失或覆蓋更新和不臟讀數(shù)據(jù)外,還進一步防止了不可重復(fù)讀和幻想 讀。例如下圖,使用 3 級封鎖協(xié)議解決了不可重復(fù)讀和幻像讀問題。上圖中,事務(wù) 1在讀 A,B之前,先對A,B加 S鎖,這樣其他事務(wù)只能再對 A,B加S鎖, 而不能加 X 鎖,即其他事務(wù)只能讀 A,B,而不能修改它們。所以當(dāng)事務(wù) 2 為修改 B 而申請1 釋放 B 上的鎖。接著事150
27、,即可重復(fù)讀。對 B 的 X 鎖時被拒絕,使其他無法執(zhí)行修改操作,只能等待事務(wù) 務(wù) 1 為驗算再讀 A , B ,這時讀出的 B 仍是 100 ,求和結(jié)果仍為 上述三級協(xié)議的主要區(qū)別在于什么操作需要申請封鎖以及何時釋放鎖 (即持鎖時間) 。三級 封鎖協(xié)議可以總結(jié)為下表。(6 ) 保證并行調(diào)度可串行性的封鎖協(xié)議 兩段封鎖協(xié)議 可串行性是并行調(diào)度正確性的唯一準(zhǔn)則, 兩段鎖( two-phase locking ,簡稱 2PL )協(xié)議是為 保證并行調(diào)度可串行性而提供的封鎖協(xié)議。兩段封鎖協(xié)議規(guī)定:在對任何數(shù)據(jù)進行讀、 寫操作之前, 事務(wù)首先要獲得對該數(shù)據(jù)的封鎖, 而且在釋放一個 封鎖之后,事務(wù)不再獲得
28、任何其他封鎖。所謂 “兩段”鎖的含義是,事務(wù)分為兩個階段,第一階段是獲得封鎖,也稱為擴展階段,第二 階段是釋放封鎖,也稱為收縮階段。例如,事務(wù) 1 的封鎖序列是:Slock A. Slock B Xlock C Unlock B Unlock A Unlock C;事務(wù) 2 的封鎖序列是:Slock A. Unlock A Slock B Xlock C Unlock C Unlock B;則事務(wù) 1 遵守兩段封鎖協(xié)議,而事務(wù) 2 不遵守兩段封鎖協(xié)議??梢宰C明, 若并行執(zhí)行的所有事務(wù)均遵守兩段鎖協(xié)議, 則對這些事務(wù)的所有并行調(diào)度策略都 是可串行化的。 因此我們得出如下結(jié)論: 所有遵守兩段鎖協(xié)議
29、的事務(wù), 其并行的結(jié)果一定是 正確的。需要說明的是, 事務(wù)遵守兩段鎖協(xié)議是可串行化調(diào)度的充分條件, 而不是必要條件。 即可串 行化的調(diào)度中,不一定所有事務(wù)都必須符合兩段封鎖協(xié)議。例如,在下圖中,(a )和( b )都是可串行化的調(diào)度,但( a )遵守兩段鎖協(xié)議,( b )不遵守兩段鎖協(xié)議。4. 死鎖和活鎖封鎖技術(shù)可以有效地解決并行操作的一致性問題, 但也帶來一些新的問題, 即死鎖和活鎖的 問題。(1 ) 活鎖如果事務(wù) T1 封鎖了數(shù)據(jù)對象 R 后,事務(wù) T2 也請求封鎖 R,于是 T2 等待。接著 T3 也請求 封鎖 R。T1 釋放 R上的鎖后,系統(tǒng)首先批準(zhǔn)了 T3 的請求, T2 只得繼續(xù)等
30、待。接著 T4 也 請求封鎖 R ,T3 釋放 R 上的鎖后,系統(tǒng)又批準(zhǔn)了 T4 的請求 ,T2 有可能就這樣永遠等 待下去。這就是活鎖的情形,如下圖所示。避免活鎖的簡單方法是采用先來先服務(wù)的策略。 當(dāng)多個事務(wù)請求封鎖同一數(shù)據(jù)對象時, 封鎖 子系統(tǒng)按請求封鎖的先后次序?qū)@些事務(wù)排隊, 該數(shù)據(jù)對象上的鎖一旦釋放, 首先批準(zhǔn)申請 隊列中第一個事務(wù)獲得鎖。(2 ) 死鎖如果事務(wù) T1 封鎖了數(shù)據(jù) A,事務(wù) T2 封鎖了數(shù)據(jù) B 。之后 T1 又申請封鎖數(shù)據(jù) B,因 T2 已 封鎖了 B,于是 T1 等待 T2 釋放 B 上的鎖。接著 T2 又申請封鎖 A,因 T1 已封鎖了 A,T2 也只能等待 T
31、1 釋放 A 上的鎖。這樣就出現(xiàn)了 T1 在等待 T2 ,而 T2 又在等待 T1 的局面, T1 和 T2 兩個事務(wù)永遠不能結(jié)束,形成死鎖。如下圖所示。死鎖問題在操作系統(tǒng)和一般并行處理中已做了深入研究, 但數(shù)據(jù)庫系統(tǒng)有其自己的特點, 操 作系統(tǒng)中解決死鎖的方法并不一定合適數(shù)據(jù)庫系統(tǒng)。目前在數(shù)據(jù)庫中解決死鎖問題主要有兩類方法,一類方法是采取一定措施來預(yù)防死鎖的發(fā) 生,另一類方法是允許發(fā)生死鎖,采用一定手段定期診斷系統(tǒng)中有無死鎖,若有則解除之。 死鎖的預(yù)防在數(shù)據(jù)庫系統(tǒng)中, 產(chǎn)生死鎖的原因是兩個或多個事務(wù)都已封鎖了一些數(shù)據(jù)對象, 然后又都請 求對已為其他事務(wù)封鎖的數(shù)據(jù)對象加鎖, 從而出現(xiàn)死鎖等待。
32、 防止死鎖的發(fā)生其實就是要破 壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法。 一次封鎖法 一次封鎖法要求每個事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖, 否則就不能繼續(xù)執(zhí)行。 例 如,在上圖的例子中,如果事務(wù) T1 將數(shù)據(jù)對象 A 和 B 一次加鎖, T1 就可以執(zhí)行下去,而 T2 等待。 T1 執(zhí)行完后釋放 A, B 上的鎖, T2 繼續(xù)執(zhí)行。這樣就不會發(fā)生死鎖。一次封鎖法雖然可以有效地防止死鎖的發(fā)生, 但也存在問題。 第一, 一次就將以后要用到的 全部數(shù)據(jù)加鎖, 勢必擴大了封鎖的范圍, 從而降低了系統(tǒng)的并發(fā)度。第二, 數(shù)據(jù)庫中數(shù)據(jù)是 不斷變化的, 原來不要求封鎖的數(shù)據(jù), 在執(zhí)行過程中可能會變成封鎖
33、對象, 所以很難實現(xiàn)精 確地確定每個事務(wù)所要封鎖的數(shù)據(jù)對象, 只能采取擴大封鎖范圍, 將事務(wù)在執(zhí)行過程中可能 要封鎖的數(shù)據(jù)對象全部加鎖,這就進一步降低了并發(fā)度。 順序封鎖法順序封鎖法是預(yù)先對數(shù)據(jù)對象規(guī)定一個封鎖順序, 所有事務(wù)都按這個順序執(zhí)行封鎖。 在上例 中,我們規(guī)定封鎖順是 A,B ,T1 和 T2 都按此順序封鎖,即 T2 也必須先封鎖 A。當(dāng) T2 請 求 A 的封鎖時,由于 T1 已經(jīng)封鎖住 A,T2 就只能等待。 T1 釋放 A ,B 上的鎖后, T2 繼續(xù) 運行。這樣就不會發(fā)生死鎖。順序封鎖法同樣可以有效地防止死鎖, 但也同樣存在問題。 第一, 數(shù)據(jù)庫系統(tǒng)中可封鎖的數(shù) 據(jù)對象及其
34、眾多, 并且隨數(shù)據(jù)的插入、 刪除等操作而不斷地變化, 要維護這樣極多而且變化 的資源的封鎖順序非常困難,成本很高。第二,事務(wù)的封鎖請求可以隨著事務(wù)的執(zhí)行而動態(tài)地決定, 很難事先確定每一個事務(wù)要封鎖 哪些對象,因此也就很難按規(guī)定的順序取施加封鎖。例如,規(guī)定數(shù)據(jù)對象的封鎖順序為 A , B, C, D,E。事務(wù) T3 起初要求封鎖數(shù)據(jù)對象 B,C, E ,但當(dāng)它封鎖 B,C 后,才發(fā)現(xiàn)還需要封鎖 A ,這樣就破壞了封鎖順序??梢?,在操作系統(tǒng)中廣為采用的預(yù)防死鎖的策略并不很適合數(shù)據(jù)庫的特點,因此 DBMS 在 解決死鎖的問題上更普遍采用的是診斷并解除死鎖的方法。 死鎖的診斷與解除 數(shù)據(jù)庫系統(tǒng)中診斷死
35、鎖的方法與操作系統(tǒng)類似, 即使用一個事務(wù)等待圖, 它動態(tài)地反映所有 事務(wù)的等待狀況。并發(fā)控制子系統(tǒng)周期性地(比如每隔 1 分鐘)檢測事務(wù)等待圖,如果發(fā) 現(xiàn)圖中存在回路, 則表示系統(tǒng)中出現(xiàn)了死鎖。 關(guān)于診斷死鎖的詳細討論請參閱操作系統(tǒng)的有 關(guān)書籍。DBMS 的并發(fā)控制子系統(tǒng)一旦檢測到系統(tǒng)中存在死鎖,就要設(shè)法解除。通常采用的方法是 選擇一個處理死鎖代價最小的事務(wù), 將其撤銷, 釋放此事務(wù)持有的所有的鎖, 使其他事務(wù)能 繼續(xù)運行下去。二、 DM 的并發(fā)控制(一 ) 事務(wù)隔離級 事務(wù)的隔離級描述了給定事務(wù)的行為對其它并發(fā)執(zhí)行事務(wù)的暴露程度。 SQL-92 共規(guī)定了 四種隔離級別,通過選擇四個隔離級中的
36、一個,用戶能增加對其它未提交事務(wù)的暴露程度, 獲得更高的并發(fā)度。隔離級別是一個事務(wù)必須與其它事務(wù)進行隔離的程度。SQL-92 的四種隔離級別如下所示, DM 支持所有這些隔離級別:(1)臟讀( READ UNCOMMITTED ):事務(wù)隔離的最低級別,事務(wù)可能查詢到其它事務(wù) 未提交的數(shù)據(jù), 僅可保證不讀取物理損壞的數(shù)據(jù))。(2)讀提交( READ COMMITTED ):DM 默認級別,保證不讀臟數(shù)據(jù)。(3 )可重復(fù)讀( REPEATABLE READ ):保證不可重復(fù)讀,但有可能讀入幻像數(shù)據(jù)。(4 )可串行化( SERIALIZABLE ):事務(wù)隔離的最高級別,事務(wù)之間完全隔離。DM 允許用
37、戶改變未啟動的事務(wù)的隔離級和讀寫特性 ,而且設(shè)置的選項將一直對那個連接 保持有效, 直到顯式更改該選項為止。 設(shè)置事務(wù)隔離級別雖然使程序員承擔(dān)了某些完整性問 題所帶來的風(fēng)險, 但可以換取對數(shù)據(jù)更大的并發(fā)訪問權(quán)。 與以前的隔離級別相比, 每個隔離 級別都提供了更大的隔離性, 但這是通過在更長的時間內(nèi)占用更多限制鎖換來的。 DM 還提 供設(shè)置事務(wù)只讀屬性的語句,使用該語句后該事務(wù)只能做查詢操作,不能更新數(shù)據(jù)庫。 需要注意的是, 事務(wù)的隔離級別并不影響事務(wù)查看本身對數(shù)據(jù)的修改, 也就是說, 事務(wù)總可 以查看自己對數(shù)據(jù)的修改。 事務(wù)的隔離級別需要根據(jù)實際需要設(shè)定, 較低的隔離級別可以增 加并發(fā),但代價
38、是降低數(shù)據(jù)的正確性。相反, 較高的隔離級別可以確保數(shù)據(jù)的正確性, 但可 能對并發(fā)產(chǎn)生負面影響。應(yīng)用程序要求的隔離級別確定了 DM 使用的鎖定行為。 下表中列出四種隔離級別允許不同類型的現(xiàn)象注意:丟失或覆蓋更新在所有的標(biāo)準(zhǔn) SQL 隔離級中都是禁止的。(二) 并發(fā)處理1. 數(shù)據(jù)鎖定機制DM 用數(shù)據(jù)鎖定機制來解決并發(fā)問題。它可以保證任何時候都可以有多個正在運行的事務(wù), 但是所有事務(wù)都在彼此完全隔離的環(huán)境中運行。DM 的封鎖對象為表和元組。封鎖的實施有自動和手動兩種,即隱式上鎖和顯式上鎖。隱式 封鎖動作的封鎖根據(jù)事務(wù)的隔離級有所不同。同時, DM 提供給用戶 4 種手動上鎖語句, 用以適應(yīng)用戶定義的
39、應(yīng)用系統(tǒng)。一般而言, DM 的隱式封鎖足以保證數(shù)據(jù)的一致性,但用戶可以根據(jù)自己的需要改變對表 的封鎖。 DM 提供給用戶四種表鎖:意向共享鎖( IS:INTENSIVE SHARE )、共享鎖 (S:SHARE )、意向排它鎖( IX:INTENSIVE EXCLUSIVE )和排它鎖( X:EXCLUSIVE )。 例如,在讀提交隔離級下,系統(tǒng)缺省的表鎖是 IS 或 IX ,在這兩種表鎖下,在訪問元組前 還需對元組進行封鎖,為了提高系統(tǒng)的效率,用戶可以手動對表進行 X 封鎖,這樣,就不 需對訪問元組封鎖。封鎖機制要達到以下目的:(1)一致性:保證用戶正在查看時,改變的數(shù)據(jù)并未從根本上發(fā)生變化
40、。(2)完整性:保證數(shù)據(jù)庫的基本結(jié)構(gòu)以正確的順序,準(zhǔn)確地反映對它們的所有改變。一個“鎖 定”可 以認為是當(dāng)某一進程需要防止其它進程做某事時獲得的某種東西,當(dāng)該進程 不再關(guān)心此事時就 “釋放”此鎖定,通常一個鎖定是加在某個 “資源”某(些客體,如表 )上 的。DM 的內(nèi)部鎖定是自動完成的。 當(dāng)某一進程要查看一個客體但不允許其他人修改它時, 就獲 得一個共享方式的鎖定。 當(dāng)某一進程要修改一客體, 并且防止任何其它進程修改它時, 就獲 得更新方式的鎖定。當(dāng)某一進程要修改一客體, 并且防止任何其它進程修改它或以共享方式 封鎖它時,就獲得獨占方式的鎖定。2. 鎖定類型DM 中的鎖有三種,表鎖、行鎖和鍵范
41、圍鎖。 表鎖表鎖用來封鎖表對象,在對表進行檢索和更新時, DM 會對表對象進行封鎖,但是 DM 為用 戶提供手動的表鎖語句, 用戶可以根據(jù)自己的需要改變對表的封鎖類型。 表鎖的模式: 意向 共享鎖 IS,意向排它鎖 IX,共享鎖 S,排它鎖 X ,共四種,其相容矩陣可定義如下表。 行鎖行鎖封鎖元組,在存取元組和更新元組前, DM 會對元組上行鎖,系統(tǒng)不提供手動的行封 鎖語句。行鎖有兩種模式:共享鎖( S)、排它鎖( X),其相容矩陣定義如下表。 鍵范圍鎖 鍵范圍鎖用在可串行事務(wù)上, 主要解決了幻像讀并發(fā)問題。 鍵范圍鎖覆蓋單個記錄以及記錄 之間的范圍, 可以防止對事務(wù)訪問的記錄集進行幻像插入或刪除。 鍵范圍鎖僅用于在可串行 隔離級別上操作的事務(wù)??纱行砸螅?如果任意一個查詢在一個事務(wù)中后面的某一時刻再次執(zhí)行, 其所獲取的行集 應(yīng)與該查詢在同一事務(wù)中以前執(zhí)行時所獲得的行集相同。如果本查詢試圖提取的行不存在, 則在試圖訪問該行的事務(wù)完成之前, 其它事務(wù)不能插入該行。 如果允許另一個事務(wù)插入該行, 則它將以幻像出現(xiàn)。如果另一個事務(wù)試圖插入駐留在鎖定數(shù)據(jù)頁上的行, 頁級鎖定可以防止添加幻像行, 并維護 可串行性。 但是, 如果該行要添加到未被第一個事務(wù)鎖定的數(shù)據(jù)頁, 應(yīng)設(shè)定鎖定機制防止添 加該行。鍵范圍鎖通過覆蓋索引行和索引行之間的范圍來工作
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機電設(shè)備銷售員工工作總結(jié)
- 2025-2030全球無線智能振動監(jiān)測傳感器行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球FinFET 3D晶體管行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球無人潛水器用于海上石油和天然氣行業(yè)行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球手機支付安全行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國納米粒度及Zeta電位分析儀行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025-2030全球高效粘泥剝離劑行業(yè)調(diào)研及趨勢分析報告
- 2025區(qū)域代理合同模板范本
- 供水工程承包合同
- 音響設(shè)備購銷合同范本
- 輸變電工程監(jiān)督檢查標(biāo)準(zhǔn)化清單-質(zhì)監(jiān)站檢查
- 2024-2025學(xué)年北京海淀區(qū)高二(上)期末生物試卷(含答案)
- 【超星學(xué)習(xí)通】馬克思主義基本原理(南開大學(xué))爾雅章節(jié)測試網(wǎng)課答案
- 2024年中國工業(yè)涂料行業(yè)發(fā)展現(xiàn)狀、市場前景、投資方向分析報告(智研咨詢發(fā)布)
- 化工企業(yè)重大事故隱患判定標(biāo)準(zhǔn)培訓(xùn)考試卷(后附答案)
- 工傷賠償授權(quán)委托書范例
- 食堂餐具炊具供貨服務(wù)方案
- 員工安全健康手冊
- 2024化工園區(qū)危險品運輸車輛停車場建設(shè)規(guī)范
- 自然科學(xué)基礎(chǔ)(小學(xué)教育專業(yè))全套教學(xué)課件
- 華為客服制度
評論
0/150
提交評論