數據庫保護技術_第1頁
數據庫保護技術_第2頁
數據庫保護技術_第3頁
數據庫保護技術_第4頁
數據庫保護技術_第5頁
已閱讀5頁,還剩57頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第8章數據庫保護技術本章內容8.1事務1

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

T: read(A); A:=A–1; write(A); read(B); B:=B+1; write(B);read(X):從數據庫傳送數據項X到事務的工作區中。write(X):從事務的工作區中將數據項X寫回數據庫。例2:考慮飛機訂票系統中的一個活動序列:(1)甲售票點讀出某航班的機票余額=16;(2)乙售票點讀出同一航班的機票余額也為16;(3)甲售票點賣出一張機票,修改余額為15,并把A寫回數據庫;(4)乙售票點也賣出一張機票,也修改余額為15,并把A寫回數據庫。甲: read(A);乙: read(A);甲: A:=A–1;乙: A:=A–1;甲: write(A);乙: write(A);

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

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

事務的一致性指的是,在一個事務執行之前和執行之后數據庫都必須處于一致性狀態。這種特性稱為事務的一致性。假如數據庫的狀態滿足所有的完整性約束,就說該數據庫是一致的。8.1.2事務的特性(3)(3)分離性(Isolation)

分離性指并發的事務是相互隔離的。即一個事務內部的操作及正在操作的數據必須封鎖起來,不被其它企圖進行修改的事務看到。

分離性是DBMS針對并發事務間的沖突提供的安全保證,通過并發控制機制實現。DBMS可以通過加鎖在并發執行的事務間提供不同級別的分離。

對任何一對事務T1,T2,在T1看來,T2要么在T1開始之前已經結束,要么在T1完成之后再開始執行。8.1.2事務的特性(4)(4)持久性(Durability)

持久性意味著當系統或介質發生故障時,確保已提交事務的更新不能丟失。即一旦一個事務提交,DBMS保證它對數據庫中數據的改變應該是永久性的,耐得住任何系統故障。

DBMS保證采取措施:

系統發生故障不能改變事務的持久性。持久性通過事務日志、數據庫備份和恢復來保證。8.1.3SQLServer的事務模式SQLServer的事務模式可分為三種:顯式事務、隱式事務、自動事務模式。顯式事務:

是指由用戶執行T-SQL事務語句而定義的事務。SQL語言中事務的定義:

事務以Begintransaction開始,以Committransaction或Rollbacktransaction結束。Committransaction表示事務正常結束,可以提交。

Rollbacktransaction表示事務非正常結束,撤消事務已做的操作,回滾到事務開始時狀態。

在SQLServer中,用SETIMPLICITY_TRANSACTIONSON和SETIMPLICITY_TRANSACTIONSOFF語句來進入隱式事務連接模式和退出隱式事務連接模式。

隱式事務不需要使用BEGINTRANSACTION語句標識事務的開始,但需要有事務結束語句COMMITTRANSACTION(或COMMITWORK)標識事務的結束。在隱式事務模式下,某些SQL語句(例CREATETABLE,DROPTABLE語句等)被執行后,馬上導致提交操作,結束當前事務。隱式事務:

自動事務是SQLServer的默認事務管理模式。在自動事務模式下,當一個語句成功執行后,它被自動提交,而當它執行過程中產生錯誤時,則被自動回滾。當應用程序與SQLServer建立連接后,直接進入自動事務模式,直到使用BEGINTRANSACTION語句開始一個顯式事務,或者打開IMPLICIT_TRANSACTIONS

連接選項進入隱式事務模式為止。當顯式事務被提交或回滾,或者關閉IMPLICIT_TRANSACTIONS連接選項后,SQLServer又進入自動事務管理模式。自動事務模式:8.1.4事務處理語句

SQLServer中有關事務處理的語句包括:

BEGINTRANSACTION

:建立一個顯式事務。

COMMITTRANSACTION

:標識一個顯式事務或隱式事務正常結束而提交。

SAVETRANSACTION

:在事務內定義一個存儲點標記。

ROLLBACKTRANSACTION

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

ROLLBACKTRANSACTION語句應在COMMITTRANSACTION語句之前調用。(2)回滾事務(3)定義存儲點標記SAVETRANSACTION:在事務內建立一個存儲點標記。ROLLBACKTRANSACTION語句可使用該標記來回滾部分事務操作。SAVETRANSACTION語句的格式為:

SAVETRANSACTION存儲點名稱(4)定義、提交和回滾事務示例下面例子說明怎樣建立一個用戶定義事務及事務中的存儲點、回滾操作和事務提交操作。

BEGINTRANSACTIONdemoSELECT*FROMdiscounts

SAVETRANSACTION

save_demo/存儲點/INSERTdiscountsVALUES(‘demo’,null,null,null,20.0)SELECT*FROMdiscounts

ROLLBACKTRANSACTION

save_demo/回滾/COMMITTRANSACTIONSELECT*FROMdiscounts/結果沒有變化/

在SQLServer中,允許定義嵌套事務,但只有最外層的BEGINTRANSACTION語句和COMMITTRANSACTION語句才能建立和提交事務,在回滾事務時,也只能使用最外層定義的事務名或存儲點標記,而不能使用內層定義的事務名。 事務嵌套常用在存儲過程或觸發器內,它們可以使用BEGINTRANSCATION

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

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

在執行批時,如果其中任一個T-SQL語句存在語法錯誤,SQLServer將取消批中所有語句的執行。例1:SELECT*FROMsalesSELECT*FRO

titleauthorGO

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

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

(dirtyread)讀值不可復現(unrepeatableread)丟失更新右圖是事務T1和T2并發執行的情況。如果x的初始值為5,則x的結果值為15。即T1對x的更新被丟失。T1T2read(x)read(x)x:=x+1write(x)x:=3xwrite(x)時間把X由5增加1變為6把X由5乘3變為15初始值X=5

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

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

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

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

通常設置的兩種基本類型的鎖:

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

獨占鎖(X鎖,eXclusivelock)

:任何寫操作均要使用獨占鎖。獨占鎖被授予已經準備好進行數據修改的事務,確保其它事務不能訪問該獨占鎖鎖定的數據。圖8-4兩種鎖的相容矩陣T1T2獨占鎖

共享鎖

—獨占鎖共享鎖

—NONOYESNOYESYESYESYESYESYES=相容的請求,NO=不相容的請求2.兩段式鎖協議

所謂"兩段式協議"名字的來源出于如下事實:

一個進程分為兩個階段,在第一個階段,該進程放置的鎖的數目穩定的增長,全是加鎖;

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

DBMS通過攔截從事務來的操作滿足第一條。第三條在事務結束時實現。3.封鎖策略(1)

DBMS封鎖數據單元的策略有如下幾種:(1)封鎖一個數據單元意味著封鎖了它的所有后代單元。這種策略實現起來很困難。因為一個單元的后代單元可能又是其他單元的后代,因此,在封鎖該數據單元的同時要找出它的所有后代單元,同時給予加鎖。釋放時要同時釋放。3.封鎖策略(1)(2)封鎖一個數據單元,只封鎖該單元本身,并不涉及它的后代。這種方法實現簡單,但要采用一些其他手段保證數據的完整性。例如,當某數據單元是其他多個數據單元的組成部分時,容易引起沖突。3.封鎖策略(2)(3)關系數據庫管理系統中,采用分層封鎖策略,即封鎖了上層節點就意味著封鎖了所有內層節點。 例如,如果有事務T1已經對關系R中的某元組加了S鎖,而事務T2要對該元組所在的關系R加X鎖,因而隱含地需要用X鎖封鎖該元組,這兩個事務就會產生矛盾。

4.封鎖的粒度(1) 數據庫中某獨立部分數據稱為一個數據單元,關系數據庫中,一個數據單元小到可以是一個數據項、一個元組、一個關系,大到一個存儲域,直至一個數據庫。封鎖單元的大小稱為封鎖粒度(Granularity)。4.封鎖的粒度(1)

封鎖的單元可以是邏輯單元,也可以是物理單元。關系數據庫中的邏輯單元為:屬性值、元組、關系、某索引項、整個索引、直至整個數據庫。關系數據庫中的物理單元為:頁(數據頁或索引頁)和存儲區。4.封鎖的粒度(2)

封鎖的粒度、系統的并發度和并發控制的開銷密切相關。封鎖的粒度越大,數據庫所能夠封鎖的數據單元就越少,并發度越小,系統開銷也越小,并行度也就越低。

反之,封鎖粒度越小,并行度越高,系統管理鎖的開銷也越大,實現起來也更加困難。因此,在封鎖單元的大小、并行度和管理鎖的開銷之間要進行權衡。

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

圖8-5分層多粒度樹關系Rn關系R1元組m元組1屬性k屬性1...5死鎖一個事務如果申請鎖而未獲準,則須等待其他事務釋放鎖。這就形成了事務間的等待關系。當事務中出現循環等待時,如果不加干預,則會一直等待下去,即出現死鎖現象。

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

溫馨提示

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

評論

0/150

提交評論