數(shù)據(jù)庫(kù)保護(hù)技術(shù)_第1頁(yè)
數(shù)據(jù)庫(kù)保護(hù)技術(shù)_第2頁(yè)
數(shù)據(jù)庫(kù)保護(hù)技術(shù)_第3頁(yè)
數(shù)據(jù)庫(kù)保護(hù)技術(shù)_第4頁(yè)
數(shù)據(jù)庫(kù)保護(hù)技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章數(shù)據(jù)庫(kù)保護(hù)技術(shù)本章內(nèi)容8.1事務(wù)1

8.2并發(fā)控制和鎖的管理328.1事務(wù)管理8.1.1事務(wù)的基本概念8.1.2事務(wù)的特性8.1.3SQLServer的事務(wù)的模式8.1.4事務(wù)的處理語(yǔ)句8.1.5批處理8.1.1事務(wù)的基本概念 事務(wù)概念是一個(gè)數(shù)據(jù)庫(kù)動(dòng)態(tài)特性的核心,是數(shù)據(jù)庫(kù)一致性的單位。事務(wù)(transaction)是用戶定義的一個(gè)數(shù)據(jù)庫(kù)操作序列,這些操作要么全做,要么全不做,是一個(gè)不可分割的工作單元。一個(gè)事務(wù)就是一組程序,完成對(duì)數(shù)據(jù)庫(kù)的某些一致性操作,事務(wù)中的SQL語(yǔ)句必須按邏輯次序執(zhí)行。事務(wù)是數(shù)據(jù)庫(kù)中的最基本的工作單元,也是數(shù)據(jù)庫(kù)恢復(fù)和并發(fā)控制的基本單元。事務(wù)的應(yīng)用背景(1)例1:某公司在銀行中有A,B兩個(gè)帳號(hào),現(xiàn)在公司想從帳號(hào)A中取出1萬(wàn)元,存入帳號(hào)B。那么在A中取出1萬(wàn)元的操作和在B中增加1萬(wàn)元的操作要么都成功完成,要么都不做。因此,需要把這二個(gè)操作定義在一個(gè)事務(wù)中。銀行轉(zhuǎn)帳:事務(wù)T從A帳戶過(guò)戶1¥到B帳戶。

T: read(A); A:=A–1; write(A); read(B); B:=B+1; write(B);read(X):從數(shù)據(jù)庫(kù)傳送數(shù)據(jù)項(xiàng)X到事務(wù)的工作區(qū)中。write(X):從事務(wù)的工作區(qū)中將數(shù)據(jù)項(xiàng)X寫回?cái)?shù)據(jù)庫(kù)。例2:考慮飛機(jī)訂票系統(tǒng)中的一個(gè)活動(dòng)序列:(1)甲售票點(diǎn)讀出某航班的機(jī)票余額=16;(2)乙售票點(diǎn)讀出同一航班的機(jī)票余額也為16;(3)甲售票點(diǎn)賣出一張機(jī)票,修改余額為15,并把A寫回?cái)?shù)據(jù)庫(kù);(4)乙售票點(diǎn)也賣出一張機(jī)票,也修改余額為15,并把A寫回?cái)?shù)據(jù)庫(kù)。甲: read(A);乙: read(A);甲: A:=A–1;乙: A:=A–1;甲: write(A);乙: write(A);

結(jié)果賣出了兩張票,數(shù)據(jù)庫(kù)中機(jī)票余額只減少1。因此,要把甲乙售票點(diǎn)的操作放在兩個(gè)事務(wù)中,一個(gè)執(zhí)行完了才能執(zhí)行另一個(gè)。事務(wù)的應(yīng)用背景(2)8.1.2事務(wù)的特性(1)事務(wù)具有四個(gè)特性:原子性(Atomicity)、一致性(Consistency)、分離性(Isolation)、持久性(Durability)。這四個(gè)特性也簡(jiǎn)稱為ACID特性。8.1.2事務(wù)的特性(2)(1)原子性(Atomicity)

事務(wù)的原子性指的是,事務(wù)中包含的程序作為數(shù)據(jù)庫(kù)的邏輯工作單位,它所做的對(duì)數(shù)據(jù)修改操作要么全部執(zhí)行,要么完全不執(zhí)行。這種特性稱為原子性。(2)一致性(Consistency)

事務(wù)的一致性指的是,在一個(gè)事務(wù)執(zhí)行之前和執(zhí)行之后數(shù)據(jù)庫(kù)都必須處于一致性狀態(tài)。這種特性稱為事務(wù)的一致性。假如數(shù)據(jù)庫(kù)的狀態(tài)滿足所有的完整性約束,就說(shuō)該數(shù)據(jù)庫(kù)是一致的。8.1.2事務(wù)的特性(3)(3)分離性(Isolation)

分離性指并發(fā)的事務(wù)是相互隔離的。即一個(gè)事務(wù)內(nèi)部的操作及正在操作的數(shù)據(jù)必須封鎖起來(lái),不被其它企圖進(jìn)行修改的事務(wù)看到。

分離性是DBMS針對(duì)并發(fā)事務(wù)間的沖突提供的安全保證,通過(guò)并發(fā)控制機(jī)制實(shí)現(xiàn)。DBMS可以通過(guò)加鎖在并發(fā)執(zhí)行的事務(wù)間提供不同級(jí)別的分離。

對(duì)任何一對(duì)事務(wù)T1,T2,在T1看來(lái),T2要么在T1開始之前已經(jīng)結(jié)束,要么在T1完成之后再開始執(zhí)行。8.1.2事務(wù)的特性(4)(4)持久性(Durability)

持久性意味著當(dāng)系統(tǒng)或介質(zhì)發(fā)生故障時(shí),確保已提交事務(wù)的更新不能丟失。即一旦一個(gè)事務(wù)提交,DBMS保證它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變應(yīng)該是永久性的,耐得住任何系統(tǒng)故障。

DBMS保證采取措施:

系統(tǒng)發(fā)生故障不能改變事務(wù)的持久性。持久性通過(guò)事務(wù)日志、數(shù)據(jù)庫(kù)備份和恢復(fù)來(lái)保證。8.1.3SQLServer的事務(wù)模式SQLServer的事務(wù)模式可分為三種:顯式事務(wù)、隱式事務(wù)、自動(dòng)事務(wù)模式。顯式事務(wù):

是指由用戶執(zhí)行T-SQL事務(wù)語(yǔ)句而定義的事務(wù)。SQL語(yǔ)言中事務(wù)的定義:

事務(wù)以Begintransaction開始,以Committransaction或Rollbacktransaction結(jié)束。Committransaction表示事務(wù)正常結(jié)束,可以提交。

Rollbacktransaction表示事務(wù)非正常結(jié)束,撤消事務(wù)已做的操作,回滾到事務(wù)開始時(shí)狀態(tài)。

在SQLServer中,用SETIMPLICITY_TRANSACTIONSON和SETIMPLICITY_TRANSACTIONSOFF語(yǔ)句來(lái)進(jìn)入隱式事務(wù)連接模式和退出隱式事務(wù)連接模式。

隱式事務(wù)不需要使用BEGINTRANSACTION語(yǔ)句標(biāo)識(shí)事務(wù)的開始,但需要有事務(wù)結(jié)束語(yǔ)句COMMITTRANSACTION(或COMMITWORK)標(biāo)識(shí)事務(wù)的結(jié)束。在隱式事務(wù)模式下,某些SQL語(yǔ)句(例CREATETABLE,DROPTABLE語(yǔ)句等)被執(zhí)行后,馬上導(dǎo)致提交操作,結(jié)束當(dāng)前事務(wù)。隱式事務(wù):

自動(dòng)事務(wù)是SQLServer的默認(rèn)事務(wù)管理模式。在自動(dòng)事務(wù)模式下,當(dāng)一個(gè)語(yǔ)句成功執(zhí)行后,它被自動(dòng)提交,而當(dāng)它執(zhí)行過(guò)程中產(chǎn)生錯(cuò)誤時(shí),則被自動(dòng)回滾。當(dāng)應(yīng)用程序與SQLServer建立連接后,直接進(jìn)入自動(dòng)事務(wù)模式,直到使用BEGINTRANSACTION語(yǔ)句開始一個(gè)顯式事務(wù),或者打開IMPLICIT_TRANSACTIONS

連接選項(xiàng)進(jìn)入隱式事務(wù)模式為止。當(dāng)顯式事務(wù)被提交或回滾,或者關(guān)閉IMPLICIT_TRANSACTIONS連接選項(xiàng)后,SQLServer又進(jìn)入自動(dòng)事務(wù)管理模式。自動(dòng)事務(wù)模式:8.1.4事務(wù)處理語(yǔ)句

SQLServer中有關(guān)事務(wù)處理的語(yǔ)句包括:

BEGINTRANSACTION

:建立一個(gè)顯式事務(wù)。

COMMITTRANSACTION

:標(biāo)識(shí)一個(gè)顯式事務(wù)或隱式事務(wù)正常結(jié)束而提交。

SAVETRANSACTION

:在事務(wù)內(nèi)定義一個(gè)存儲(chǔ)點(diǎn)標(biāo)記。

ROLLBACKTRANSACTION

:回滾事務(wù)。(1)定義和提交事務(wù)BEGINTRANSACTION和COMMITTRANSACTION的語(yǔ)句格式:BEGINTRANSACTION[事務(wù)名稱] {SQL語(yǔ)句}COMMITTRANSACTION①哪些SQL語(yǔ)句組成一個(gè)事務(wù)由用戶根據(jù)情況而定。②定義一個(gè)事務(wù)時(shí),BEGINTRANSACTION語(yǔ)句與COMMITTRANSACTION語(yǔ)句必須成對(duì)出現(xiàn)。ROLLBACKTRANSACTION:回滾事務(wù),消除事務(wù)執(zhí)行的影響。在一個(gè)事務(wù)被提交之前可以使用ROLLBACKTRANSACTION回滾,一旦提交就不能撤銷。語(yǔ)句格式:ROLLBACKTRANSACTION[事務(wù)名稱|存儲(chǔ)點(diǎn)名稱]該語(yǔ)句回滾整個(gè)事務(wù)或是存儲(chǔ)點(diǎn)定義以后所發(fā)生的事務(wù)。

ROLLBACKTRANSACTION語(yǔ)句應(yīng)在COMMITTRANSACTION語(yǔ)句之前調(diào)用。(2)回滾事務(wù)(3)定義存儲(chǔ)點(diǎn)標(biāo)記SAVETRANSACTION:在事務(wù)內(nèi)建立一個(gè)存儲(chǔ)點(diǎn)標(biāo)記。ROLLBACKTRANSACTION語(yǔ)句可使用該標(biāo)記來(lái)回滾部分事務(wù)操作。SAVETRANSACTION語(yǔ)句的格式為:

SAVETRANSACTION存儲(chǔ)點(diǎn)名稱(4)定義、提交和回滾事務(wù)示例下面例子說(shuō)明怎樣建立一個(gè)用戶定義事務(wù)及事務(wù)中的存儲(chǔ)點(diǎn)、回滾操作和事務(wù)提交操作。

BEGINTRANSACTIONdemoSELECT*FROMdiscounts

SAVETRANSACTION

save_demo/存儲(chǔ)點(diǎn)/INSERTdiscountsVALUES(‘demo’,null,null,null,20.0)SELECT*FROMdiscounts

ROLLBACKTRANSACTION

save_demo/回滾/COMMITTRANSACTIONSELECT*FROMdiscounts/結(jié)果沒有變化/

在SQLServer中,允許定義嵌套事務(wù),但只有最外層的BEGINTRANSACTION語(yǔ)句和COMMITTRANSACTION語(yǔ)句才能建立和提交事務(wù),在回滾事務(wù)時(shí),也只能使用最外層定義的事務(wù)名或存儲(chǔ)點(diǎn)標(biāo)記,而不能使用內(nèi)層定義的事務(wù)名。 事務(wù)嵌套常用在存儲(chǔ)過(guò)程或觸發(fā)器內(nèi),它們可以使用BEGINTRANSCATION

……COMMITTRANSACTION對(duì)來(lái)相互調(diào)用。(5)事務(wù)嵌套(6)事務(wù)狀態(tài)的變化0活動(dòng)狀態(tài)2失敗狀態(tài)1部分可提交狀態(tài),部分語(yǔ)句沒執(zhí)行3提交狀態(tài)4回滾狀態(tài)初始狀態(tài)事務(wù)無(wú)法繼續(xù)正常執(zhí)行事務(wù)回滾,數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)開始前狀態(tài)執(zhí)行最后一條語(yǔ)句成功完成,永久寫入數(shù)據(jù)庫(kù)圖7-6事務(wù)狀態(tài)的變化5結(jié)束狀態(tài)8.1.5批處理批是一組SQL語(yǔ)句的集合,一個(gè)批以批處理結(jié)束符號(hào)GO結(jié)束。批中語(yǔ)句被一次提交給SQLServer,SQLServer將這些語(yǔ)句編譯為一個(gè)執(zhí)行單元,稱做SQLServer執(zhí)行計(jì)劃。GO不是SQL語(yǔ)句。它是在某些客戶端工具中使用的符號(hào),客戶端工具將它解釋為:最后一個(gè)GO上面的所有內(nèi)容都應(yīng)該一起發(fā)送到服務(wù)器來(lái)執(zhí)行。例:右邊例子中的注釋符號(hào)并沒有起到預(yù)先的目的。原因:客戶端工具并沒有解釋任何SQL語(yǔ)句,它只是將語(yǔ)句分解成多個(gè)批處理。SQLServer批處理的示例(1)SELECT*FROMauthors/*GOSELECT*FROMsalesGOSELECT*FROMpublishersGO*/SELECT*FROMtitlesGO

如果在一個(gè)包含批處理結(jié)束的GO命令T-SQL語(yǔ)句集合中,想注釋一些語(yǔ)句,那么應(yīng)該在每個(gè)GO的前面使用另外一種注釋標(biāo)記符:兩個(gè)短劃線(也可以用其它字符代替兩個(gè)短劃線)。上例中的應(yīng)改為:SELECT*FROMauthors/*--GOSELECT*FROMsales--GOSELECT*FROMpublishers--GO*/SELECT*FROMtitlesGOSQLServer批處理的示例(2)

在執(zhí)行批時(shí),如果其中任一個(gè)T-SQL語(yǔ)句存在語(yǔ)法錯(cuò)誤,SQLServer將取消批中所有語(yǔ)句的執(zhí)行。例1:SELECT*FROMsalesSELECT*FRO

titleauthorGO

在上例中,第一個(gè)語(yǔ)句是正確的,第二個(gè)語(yǔ)句存在語(yǔ)法錯(cuò)誤,但由于這兩個(gè)語(yǔ)句是在一個(gè)批中,第一個(gè)語(yǔ)句不會(huì)被執(zhí)行,執(zhí)行這個(gè)批的結(jié)果是返回一個(gè)錯(cuò)誤信息。SQLServer批處理的示例(3)建立批時(shí)應(yīng)注意的事項(xiàng)CREATEVIEW、CREATERULE、CREATEDEFAULT、CREATETRIGGER、CREATEPROCEDURE 語(yǔ)句應(yīng)在批中單獨(dú)提交,它們不能與其它T-SQL語(yǔ)句一起構(gòu)成一個(gè)批。(2)使用ALTERTABLE語(yǔ)句修改表結(jié)構(gòu)后,不能在同一個(gè)批中參照新定義列。(3)EXECUTE(或EXEC)語(yǔ)句為批中第一個(gè)語(yǔ)句時(shí),EXECUTE(或EXEC)關(guān)鍵字可以省略。否則,必須使用該關(guān)鍵字。批和事務(wù)的區(qū)別批是一個(gè)客戶端的基本概念,它控制多個(gè)語(yǔ)句如何發(fā)送到SQLServer以便立即處理。而事務(wù)是一個(gè)服務(wù)器端的概念,是SQLServer執(zhí)行T-SQL語(yǔ)句的基本工作單元。批語(yǔ)句的組合發(fā)生在編譯時(shí)刻,而事務(wù)中語(yǔ)句的組合發(fā)生在執(zhí)行時(shí)刻。當(dāng)在編譯時(shí),如果批中某個(gè)語(yǔ)句存在語(yǔ)法錯(cuò)誤,SQLServer將取消這個(gè)批中所有語(yǔ)句的執(zhí)行。在執(zhí)行時(shí)刻,如果事務(wù)中某個(gè)數(shù)據(jù)修改操作違犯約束、規(guī)則、觸發(fā)器等條件時(shí),SQLServer將回滾整個(gè)事務(wù)。在一個(gè)批中可以包含多個(gè)事務(wù),在一個(gè)事務(wù)中也可以包含多個(gè)批。一個(gè)事務(wù)中包含批的示例例1:下面的例子是一個(gè)事務(wù),它由四個(gè)批處理組成:BEGINTRANINSERTauthorsVALUES(...)GOSELECT*FROMauthorsGOUPDATEpublishersSETpub_id=(...)GOSELECT*FROMpublishersGOCOMMITTRAN一個(gè)批中包含多個(gè)事務(wù)示例例2:下面的例子是一個(gè)批處理,它由兩個(gè)事務(wù)組成:BEGINTRANINSERTauthorsVALUES(...)SELECT*FROMauthorsCOMMITTRANBEGINTRAN

UPDATEpublishersSETpub_id=...INSERTpublishersVALUES(...)COMMITTRANGO8.2并發(fā)控制和鎖的管理8.2.1并發(fā)控制8.2.2鎖的管理8.2.1并發(fā)控制數(shù)據(jù)庫(kù)是一個(gè)共享資源,可供多個(gè)用戶使用。允許多個(gè)用戶同時(shí)使用的數(shù)據(jù)庫(kù)系統(tǒng)稱為多用戶數(shù)據(jù)庫(kù)系統(tǒng)。例如:銀行數(shù)據(jù)庫(kù)系統(tǒng)、機(jī)票訂票數(shù)據(jù)庫(kù)系統(tǒng)等。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),就可能會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制,就可能會(huì)導(dǎo)致讀和寫不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。并發(fā)控制的核心問題是在保證數(shù)據(jù)庫(kù)一致性的前提下最大限度地提高并發(fā)度。并發(fā)所引起的問題事務(wù)如果不加控制地并發(fā)執(zhí)行,會(huì)產(chǎn)生下列三個(gè)問題:丟失更新(lostupdate)讀臟數(shù)據(jù)

(dirtyread)讀值不可復(fù)現(xiàn)(unrepeatableread)丟失更新右圖是事務(wù)T1和T2并發(fā)執(zhí)行的情況。如果x的初始值為5,則x的結(jié)果值為15。即T1對(duì)x的更新被丟失。T1T2read(x)read(x)x:=x+1write(x)x:=3xwrite(x)時(shí)間把X由5增加1變?yōu)?把X由5乘3變?yōu)?5初始值X=5

丟失更新問題是由于兩個(gè)事務(wù)對(duì)同一數(shù)據(jù)并發(fā)寫入所引起的,這稱為“寫-寫沖突”。讀臟數(shù)據(jù)(1)

右圖中,T1對(duì)某元組t的兩個(gè)屬性x,y進(jìn)行更新,T2并發(fā)地讀取t[x],t[y],x在更新前讀,y在更新后讀,這樣所讀得的值既不反映t更新前的狀態(tài),也不反映t更新后的狀態(tài),是不一致的數(shù)據(jù)。T1T2read(x)write(t)時(shí)間read(y)(rollback)更新t[x]更新t[y]讀更新后的t[y]讀更新前的t[x]可能會(huì)讀到臟數(shù)據(jù)的另一種情況:當(dāng)T2計(jì)算某種聚集函數(shù)(例如AVG)時(shí),要用到多個(gè)元組的某一屬性值(例如工資),如果T1并發(fā)地修改工資值,則T2在計(jì)算平均工資時(shí),有些可能是修改前的工資值,有些可能是修改后的工資值,這也是一種不一致性。讀臟數(shù)據(jù)問題是由于一個(gè)事務(wù)讀另一個(gè)更新事務(wù)尚未提交的數(shù)據(jù)所引起的,這稱為“讀-寫沖突”。讀臟數(shù)據(jù)(2)讀值不可復(fù)現(xiàn)(1)

在右圖中,T1兩次讀x,本來(lái)T1兩次讀出的x應(yīng)該是一樣的,但如果在兩次讀之間,另一個(gè)與T1并發(fā)執(zhí)行的事務(wù)T2修改了x,則T1兩次讀出的x可能就不同。讀值不可復(fù)現(xiàn)也是由“讀-寫沖突”所引起的。T1T2read(x)write(x)時(shí)間read(x)更新X值讀更新前的X值讀更新后的X值并發(fā)控制的任務(wù)就是避免訪問沖突所引起的數(shù)據(jù)不一致。數(shù)據(jù)庫(kù)管理系統(tǒng)一般都提供并發(fā)控制機(jī)制。即采用對(duì)資源加鎖的方法控制用戶并發(fā)操作。讀值不可復(fù)現(xiàn)(2)8.2.2鎖的管理

為了避免并發(fā)事務(wù)引起操作的沖突,DBMS提供了對(duì)數(shù)據(jù)進(jìn)行封鎖的管理機(jī)制。1.加鎖和解鎖加鎖(LOCK):當(dāng)一個(gè)事務(wù)訪問數(shù)據(jù)庫(kù)中的某個(gè)數(shù)據(jù)單元時(shí),要先對(duì)被訪問的數(shù)據(jù)單元加鎖。假如要訪問的數(shù)據(jù)單元還沒有設(shè)置其他鎖,該事務(wù)就獲得訪問權(quán),否則,該事務(wù)必須等待直到釋放其他的鎖。解鎖(UNLOCK):進(jìn)程訪問結(jié)束釋放鎖。1.兩種基本的鎖類型

通常設(shè)置的兩種基本類型的鎖:

共享鎖(S鎖,Sharedlock):只用于并發(fā)的只讀數(shù)據(jù)操作。任何試圖修改某數(shù)據(jù)的事務(wù),如果該數(shù)據(jù)上有共享鎖,那么該事務(wù)就會(huì)被阻塞,直到所有的共享鎖被釋放。

獨(dú)占鎖(X鎖,eXclusivelock)

:任何寫操作均要使用獨(dú)占鎖。獨(dú)占鎖被授予已經(jīng)準(zhǔn)備好進(jìn)行數(shù)據(jù)修改的事務(wù),確保其它事務(wù)不能訪問該獨(dú)占鎖鎖定的數(shù)據(jù)。圖8-4兩種鎖的相容矩陣T1T2獨(dú)占鎖

共享鎖

—獨(dú)占鎖共享鎖

—NONOYESNOYESYESYESYESYESYES=相容的請(qǐng)求,NO=不相容的請(qǐng)求2.兩段式鎖協(xié)議

所謂"兩段式協(xié)議"名字的來(lái)源出于如下事實(shí):

一個(gè)進(jìn)程分為兩個(gè)階段,在第一個(gè)階段,該進(jìn)程放置的鎖的數(shù)目穩(wěn)定的增長(zhǎng),全是加鎖;

第二個(gè)階段只能釋放鎖,而且是一起釋放。必須遵守的兩段式協(xié)議的內(nèi)容:(1)一個(gè)數(shù)據(jù)單元在第一次被訪問之前必須對(duì)它加鎖。(2)如果一個(gè)數(shù)據(jù)單元已經(jīng)有了一個(gè)共享鎖,只能對(duì)它再附加共享鎖。假如它有了一個(gè)獨(dú)占鎖,不能再對(duì)它附加任何鎖。(3)由一個(gè)進(jìn)程設(shè)置的所有鎖,只能在該進(jìn)程結(jié)束時(shí)釋放,而且要一起釋放。

DBMS通過(guò)攔截從事務(wù)來(lái)的操作滿足第一條。第三條在事務(wù)結(jié)束時(shí)實(shí)現(xiàn)。3.封鎖策略(1)

DBMS封鎖數(shù)據(jù)單元的策略有如下幾種:(1)封鎖一個(gè)數(shù)據(jù)單元意味著封鎖了它的所有后代單元。這種策略實(shí)現(xiàn)起來(lái)很困難。因?yàn)橐粋€(gè)單元的后代單元可能又是其他單元的后代,因此,在封鎖該數(shù)據(jù)單元的同時(shí)要找出它的所有后代單元,同時(shí)給予加鎖。釋放時(shí)要同時(shí)釋放。3.封鎖策略(1)(2)封鎖一個(gè)數(shù)據(jù)單元,只封鎖該單元本身,并不涉及它的后代。這種方法實(shí)現(xiàn)簡(jiǎn)單,但要采用一些其他手段保證數(shù)據(jù)的完整性。例如,當(dāng)某數(shù)據(jù)單元是其他多個(gè)數(shù)據(jù)單元的組成部分時(shí),容易引起沖突。3.封鎖策略(2)(3)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中,采用分層封鎖策略,即封鎖了上層節(jié)點(diǎn)就意味著封鎖了所有內(nèi)層節(jié)點(diǎn)。 例如,如果有事務(wù)T1已經(jīng)對(duì)關(guān)系R中的某元組加了S鎖,而事務(wù)T2要對(duì)該元組所在的關(guān)系R加X鎖,因而隱含地需要用X鎖封鎖該元組,這兩個(gè)事務(wù)就會(huì)產(chǎn)生矛盾。

4.封鎖的粒度(1) 數(shù)據(jù)庫(kù)中某獨(dú)立部分?jǐn)?shù)據(jù)稱為一個(gè)數(shù)據(jù)單元,關(guān)系數(shù)據(jù)庫(kù)中,一個(gè)數(shù)據(jù)單元小到可以是一個(gè)數(shù)據(jù)項(xiàng)、一個(gè)元組、一個(gè)關(guān)系,大到一個(gè)存儲(chǔ)域,直至一個(gè)數(shù)據(jù)庫(kù)。封鎖單元的大小稱為封鎖粒度(Granularity)。4.封鎖的粒度(1)

封鎖的單元可以是邏輯單元,也可以是物理單元。關(guān)系數(shù)據(jù)庫(kù)中的邏輯單元為:屬性值、元組、關(guān)系、某索引項(xiàng)、整個(gè)索引、直至整個(gè)數(shù)據(jù)庫(kù)。關(guān)系數(shù)據(jù)庫(kù)中的物理單元為:頁(yè)(數(shù)據(jù)頁(yè)或索引頁(yè))和存儲(chǔ)區(qū)。4.封鎖的粒度(2)

封鎖的粒度、系統(tǒng)的并發(fā)度和并發(fā)控制的開銷密切相關(guān)。封鎖的粒度越大,數(shù)據(jù)庫(kù)所能夠封鎖的數(shù)據(jù)單元就越少,并發(fā)度越小,系統(tǒng)開銷也越小,并行度也就越低。

反之,封鎖粒度越小,并行度越高,系統(tǒng)管理鎖的開銷也越大,實(shí)現(xiàn)起來(lái)也更加困難。因此,在封鎖單元的大小、并行度和管理鎖的開銷之間要進(jìn)行權(quán)衡。

4.封鎖的粒度(2)從用戶的角度看,如果在一個(gè)系統(tǒng)中同時(shí)支持多種封鎖粒度供不同的事務(wù)選擇是比較理想的,這種封鎖方法稱為多粒度封鎖(MultipleGranularityLocking)。多粒度鎖數(shù)據(jù)庫(kù)DB...…

圖8-5分層多粒度樹關(guān)系Rn關(guān)系R1元組m元組1屬性k屬性1...5死鎖一個(gè)事務(wù)如果申請(qǐng)鎖而未獲準(zhǔn),則須等待其他事務(wù)釋放鎖。這就形成了事務(wù)間的等待關(guān)系。當(dāng)事務(wù)中出現(xiàn)循環(huán)等待時(shí),如果不加干預(yù),則會(huì)一直等待下去,即出現(xiàn)死鎖現(xiàn)象。

死鎖發(fā)生時(shí),至少有兩個(gè)或多個(gè)事務(wù)同時(shí)處于等待狀態(tài),每個(gè)事務(wù)都在等待其他事務(wù)釋放鎖才可繼續(xù)執(zhí)行。事務(wù)相互等待示例R2R1R3T1已占有資源T3已占有資源T2已占有資源圖8-7(2)死鎖的解決辦法解決死鎖一般采用兩個(gè)方法:死鎖的預(yù)防死鎖的檢測(cè)與解除(3)死鎖的預(yù)防預(yù)防死鎖的方法較多,如:(1)一次封鎖法:一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行。(3)死鎖的預(yù)防(2)順序封鎖法:順序封鎖法是預(yù)先對(duì)數(shù)據(jù)對(duì)象規(guī)定一個(gè)封鎖順序,所有事務(wù)都按這個(gè)順序?qū)崿F(xiàn)封鎖。例如,在圖8-7中,如果封鎖的次序都是R1-R2,就不會(huì)出現(xiàn)死鎖,因?yàn)樵赥1沒有結(jié)束之前,T2不可能開始。(4)死鎖的檢測(cè)與解除(1)如果允許數(shù)據(jù)庫(kù)中出現(xiàn)死鎖,應(yīng)盡可能及時(shí)發(fā)現(xiàn)和處理,死鎖的檢測(cè)一般使用超時(shí)法或等待圖法。(1)超時(shí)法:如果一個(gè)事務(wù)的等待時(shí)間超過(guò)了規(guī)定的時(shí)限,則認(rèn)為發(fā)生了死鎖。(4)死鎖的檢測(cè)與解除(1)(2)等待圖法:事務(wù)等待圖是一個(gè)有向圖G=(T,U),T為結(jié)點(diǎn)的集合,每個(gè)結(jié)點(diǎn)表示正運(yùn)行的事務(wù);U為邊的集合,每條邊表示事務(wù)等待的情況。若T1等待T2,則T1,T2之間有一條有向邊,從T1指向T2。如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。發(fā)現(xiàn)死鎖后,靠事務(wù)本身無(wú)法打破死鎖,必須由DBMS干預(yù)。DBMS對(duì)死鎖

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論