目錄
- 11. 事務管理
-
- 11.1 本章重點
- 11.2 事務的基本概念
-
- 11.2.1 概述
- 11.2.2 事物的特性
- 11.2.3 事務的狀态
- 11.3 資料庫的并發控制
-
- 11.3.1 事務排程
- 11.3.2 并發操作帶來的問題
- 11.3.3.并發排程的可串行性
- 11.3.4 并發控制技術
- 11.3.5 兩段鎖協定
- 11.3.6 多粒度封鎖協定(了解一下P517)
- 11.4 資料庫的備份與恢複
-
- 11.4.1 資料庫系統故障種類
- 11.4.2 資料庫備份
- 11.5 資料庫的安全性與完整性
11. 事務管理
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9EFRPFzYU5UeBRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxcTM5EDM0QTM1ITMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
11.1 本章重點
本章特别重要,上午題下午題考官都很愛它,嗯!單單2020年11月08日的下午題就考了兩段鎖協定、死鎖、事務控制以及檢查點等知識,吃透本章,于工作于考試均不虧!
11.2 事務的基本概念
11.2.1 概述
事務(Transaction)是一系列的資料庫操作,是資料庫應用程式的基本邏輯機關,即應用程式對資料庫的操作都應該以事務的方式進行。
事務是一個操作序列,這些操作“要麼都做,要麼都不做”,是資料庫環境中不可分割的邏輯工作機關,事務和程式是兩個不同的概念,一般一個程式可包含多個事務。
事務定義的語句如下:
(1)BEGIN TRANSACTION:事務開始;
(2)END TRANSACTION:事務結束;
(3)COMMIT:事務送出,該操作表示事務成功的結束,它将通知事務管理器該事物的所有更新操作現在可以被送出或永久德保留;
(4)ROLLBACK:事務復原,該操作表示事務非成功的結束,它将通知事務管理器出故障了,資料庫可能處于不一緻的狀态,該事物的所有更新操作必須復原或撤銷。
SQL中事務的開始與結束:SQL标準規定當一條sql語句被執行,就隐式的開始了一個事務,SQL中的Commit work和Rollback work語句都是結束一個事務的标志。
(1)Commit work:送出目前事務,這意味着該事務所做的更新在資料庫中永久儲存,一旦事務送出,一個新的事務自動開始。
(2)Rollback work:復原目前事務,這意味着将撤銷該事務對資料庫的更新,這樣,資料庫恢複到該事務執行第一條語句之前的狀态。
注意:若事務已執行Commit work就不能用Rollback work撤銷。資料庫系統能夠保證在發生諸如某天SQL語句錯誤、斷電、系統崩潰的情況下,若事務還沒有執行Commit work,則造成的影響将被復原。對斷電、系統崩潰的情況,復原實在系統重新啟動時進行。
11.2.2 事物的特性
典型的事務例子是銀行轉賬業務,對于“從賬戶A轉入賬戶B金額X元”業務,從資料庫系統角度包含2個操作:1)從賬戶A減去X元;2)給賬戶B加上X元。
事務的ACID特性:
1.原子性(Atomicity):事務的所有操作在資料庫要麼全做要麼全不做。
2.一緻性(Consistency):一個事務獨立執行的結果,将保持資料的一緻性,即資料不會因為事務的執行而遭受破壞。就銀行轉賬案例來說,假設賬戶A和賬戶B兩者餘額加起來是100000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個賬戶餘額相加起來還是100000,這就是事務的一緻性。一緻性可以有DBMS的完整性限制機制來自動完成,而複雜的事物則由應用程式來完成。
3.隔離性(Isolation):一個事務的執行不能被其他事務幹擾。并發事務在執行過程中可能會對同一資料操作,這些事務的操作應該不會互相幹擾,是互相隔離的。
4.持久性(Durability):一旦事務送出,它對資料庫的改變是永久的,即便系統出現故障也是如此。
11.2.3 事務的狀态
如果不出現故障,事務預設都能執行完成,一旦執行過程發生故障,不能執行完成的事務稱之為中止事務;撤銷中止事務對資料庫的更新稱為事務復原;成功執行完成的事務稱為已送出事務。
中止事務可以通過DBMS復原恢複資料庫,已送出事務不能復原,但可以由程式員或DBA手動執行“補償事務”撤銷送出事務對資料庫的影響。
事務的5種狀态:
1.活動狀态:事務的初始狀态,事務執行時的狀态。
2.部分送出狀态:事務中最後一條語句(事務全部執行完,但實際輸出可能還在記憶體中)被執行後的狀态。
3.失敗狀态:事務不能繼續正常執行的狀态。
4.中止狀态:事務復原并且資料庫已經恢複到事務開始執行前的狀态,事務進入中止狀态後,系統要麼重新開機事務(軟硬體錯誤引起的中止事務)要麼殺死事務(事物内部的邏輯造成的錯誤或者輸入錯誤等造成的中止事務)。
5.送出狀态:事務在部分送出後,将往硬碟上寫入資料,當最後一條資訊寫入後(事務成功完成)的狀态,隻有事務處于送出狀态後才能說事務已經送出。
事務狀态轉換圖:
11.3 資料庫的并發控制
所謂并發操作,是指在多使用者共享的系統中,許多使用者可能同時對同一資料進行操作,并發操作帶來的問題是資料的不一緻性主要有3類:丢失更新、不可重複度和讀髒資料,其主要的原因是事務的并發操作破壞了事務的隔離性。DBMS的并發控制子系統負責協調并發事務的執行,保證資料庫的完整性不受破壞,避免使用者得到不正确的資料。
11.3.1 事務排程
1.串行排程(Serial Schedule)是指多個事務依次串行執行,且隻有當一個事務的所有操作都執行完後才執行另一個事務的所有操作,案例參詳書本P-509。
對兩個事務T0,T1,不論是先執行T0後執行T1,還是先執行T1後執行T0,隻要是串行排程,執行的結果都是穩定和正确的,對于N個事務,最多有N!中正确的串行排程。
2.并發排程(Concurrent Schedule):利用分時的方法同時處理多個事務。對于N個事務進行并發排程,情況會變得複雜得多,排程方案遠大于N!個,并且并發排程的結果有可能是錯誤的。
3.可恢複排程(Recoverable Schedule):事務Tj要讀事務Ti寫的資料時,事務Tj必須要先于事務Ti送出。
11.3.2 并發操作帶來的問題
1.丢失修改:當兩個或多個事物讀入同一資料并修改,會發生丢失丢該的問題,如上圖丢失修改案例, T 1 T_1 T1事務的A=A-1修改操作被 T 2 T_2 T2事務的A=A-1所覆寫,也就是丢失了 T 1 T_1 T1事務的修改操作。
2.不可重複讀:是指在資料庫通路中,一個事務範圍内兩個相同的查詢卻傳回了不同資料。如上圖不可重複讀案例中,事務 T 1 T_1 T1分别在 T 2 T_2 T2和 t 9 t_9 t9時刻讀取了B的值,但是事務 T 2 T_2 T2在 t 5 t_5 t5時刻對B的值進行了修改操作,導緻 T 1 T_1 T1事務兩次讀取B的值不同,進而檢驗運算C=A+B不對(兩次運算結果不一緻)。也就是在同一事務内兩次讀取同一資料輸出結果不同,是因為在兩次讀取的時間間隙裡,其他事務對該資料進行了修改操作。
3.讀髒資料: 如上圖讀髒資料案例, T 1 T_1 T1事務修改C資料後(未送出到資料庫), T 2 T_2 T2事務讀取C資料為200,但是 t 7 t_7 t7時刻 T 1 T_1 T1事務撤銷了對C資料的修改,即C恢複原值,那 T 2 T_2 T2事務讀到的資料與資料不一緻(無效),稱之為讀髒資料。
這3種情況是發生在事務并行處理的過程中,原因是多個事務對相同資料的通路,幹擾了其他事務的處理,産生了資料的不一緻性,是事務隔離性的破壞導緻了資料的不一緻性。問題的焦點在于事務在讀寫資料是不加以控制而互相幹擾,解決問題的方法是如何保證事務的隔離性入手。
資料庫事務的隔離級别如下:由低到高依次為Read Uncommitted 、Read Committed 、Repeatable Read 、Serializable ,這四個級别可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 (非常重要)
11.3.3.并發排程的可串行性
資料庫系統必須控制事務的并發執行以保證資料庫處于一緻性狀态。
1.可串行化的排程
多個事務的并發執行是正确的,當且僅當其結果與某一次序串行的執行它們時的結果相同,稱這種排程政策是可串行化的排程(Serializability Schedule)。
可串行性是并發事務正确性的準則,按這個準則規定,一個給定的并發排程,當且僅當它是可串行化的才認為是正确排程。
2.沖突可串行化
沖突(Conflict):當 I i I_i Ii和 I j I_j Ij是不同僚務在相同的資料項上操作的指令,且至少有一個是write指令時(不同的事務對同一資料的讀寫操作和寫寫操作),則稱 I i I_i Ii與 I j I_j Ij是沖突的。
等價排程:設 I i I_i Ii與 I j I_j Ij是排程S的兩條連續指令,若 I i I_i Ii與 I j I_j Ij是不同僚務的指令且不沖突,則可由交換 I i I_i Ii與 I j I_j Ij的順序得到一個新的排程 S ∗ S^* S∗,則 S S S和 S ∗ S^* S∗是等價的。
沖突等價:如果排程 S S S經過一系列非沖突指令交換成 S ∗ S^* S∗,則稱 S ∗ S^* S∗與 S S S是沖突等價的。
沖突可串行化:若排程 S S S與一個串行排程 S ∗ S^* S∗沖突等價,則 S S S是沖突可串行化的。
概念讀得暈乎乎,總而言之這些條條框框都是服務于避免并發操作問題的,工作中遇到實操幾次就明了了,不要糾結于這些彎彎繞繞的理論。
3.沖突可串行化判定
在設計并發控制機制時,必須證明該機制産生的排程是否可串行化,一般通過S構造一個有向圖—優先圖(Precedence Graph)G(V,E)來判定,V由所有事務組成的頂點集,E是一個邊集,由滿足下述三個條件的邊 T i → T j T_i→T_j Ti→Tj組成:
(1)在 T j T_j Tj執read(A)之前, T i T_i Ti執行write(A);
(2)在 T j T_j Tj執write(A)之前, T i T_i Ti執行read(A);
(3)在 T j T_j Tj執write(A)之前, T i T_i Ti執行write(A)。
如果優先圖中存在邊 T i → T j T_i→T_j Ti→Tj,則任何等價于 S S S的串行排程 S ′ S' S′中, T i T_i Ti必出現在 T j T_j Tj之前。
對應以上2圖的優先圖:排程S4中,T0執行read(A)優先于T1執行write(A),所有有一條邊 T 0 → T 1 T_0→T_1 T0→T1,又因為T1執行read(B)優先于T0執行write(B),所有有邊 T 1 → T 0 T_1→T_0 T1→T0。
有過排程S的優先圖中存在環,則排程S是沖突不可串行化的,如果無環,則排程S是沖突可串行化的。
11.3.4 并發控制技術
并發事務控制的最常用手段是加鎖,該方法隻允許事務通路目前持有鎖的資料項,常用鎖:排它鎖和共享鎖。
排他鎖(Exclusive Locks,X鎖)也稱為寫鎖,用于對資料進行寫操作時進行鎖定,如果事務T對資料A加上X鎖後,就隻允許事務T對讀取和修改資料A,其他事務對資料A不能再加任何鎖,也不能讀取和修改資料A,知道事務T釋放A上的鎖。
共享鎖(Share Locks,S鎖)也稱為讀鎖,用于對資料讀操作的鎖定。如果事務T對資料A加上了S鎖後,事務T就隻能讀資料A但不可以修改,其他事務可以在對資料A加S鎖來讀取,隻要資料A上有S鎖,任何事務都隻能對其加S鎖讀取而不能加X鎖修改資料。
簡言之,若T事務對A資料加了X鎖,其他事務對資料A不能加X鎖和S鎖;若T事務對A資料加了S鎖,其他事務對資料A能加S鎖,不能加X鎖。
11.3.5 兩段鎖協定
通過封鎖協定來解決在保證事務的一緻性的前提下盡可能提高并發性問題,封鎖協定主要是三級封鎖協定和兩段鎖協定。
1.封鎖協定
(1)一級封鎖協定:是事務T在修改資料A之前必須先對其加X鎖,直到事務結束才釋放X鎖,用來解決丢失修改問題。
(2)二級封鎖協定:是在一級封鎖協定基礎上加上事務T在讀取資料A之前必須對其加上S鎖,讀完後即可釋放S鎖,解決讀髒資料的問題。
(3)三級封鎖協定:是在一級封鎖協定基礎上加上事務T在讀取資料A之前必須對其加上S鎖,直到事務結束才可釋放S鎖,解決了不可重複度的問題。
2.兩段鎖協定
兩段鎖協定是指任何資料進行讀寫之前必須對該資料加鎖,在釋放一個封鎖之後,事務不再申請和獲得任何其他封鎖。
所謂“兩段”鎖含義:事務分為兩階段,第一階段獲得封鎖,也稱為擴充階段,第二階段是釋放封鎖,也稱為收縮階段。
如果事務都遵循兩段鎖協定,那麼他們的并發排程是可串行化的。兩段鎖是可串行化的充分不必要條件。也就是如果事務不遵循兩段鎖協定,那麼它們的排程可能是可串行也可能不可串行。
注意:采用兩段鎖協定也有可能産生死鎖,因為每個事務都不能及時解除被他封鎖的資料,可能會導緻多個事務互相都要求對方已封鎖的資料不能繼續運作。
3.活鎖和死鎖
所謂活鎖:如果事務 T 1 T_1 T1封鎖了資料 R R R,事務 T 2 T_2 T2又請求封鎖 R R R,于是 T 2 T_2 T2等待。 T 3 T_3 T3也請求封鎖 R R R,當 T 1 T_1 T1釋放了R上的封鎖之後系統首先準許了 T 3 T_3 T3的請求, T 2 T_2 T2仍然等待。然後 T 4 T_4 T4又請求封鎖 R R R,當 T 3 T_3 T3釋放了 R R R上的封鎖之後系統又準許了 T 4 T_4 T4的請求,以此類推, T 2 T_2 T2有可能永遠等待,避免活鎖的簡單方法是采用先來先服務的政策。
所謂死鎖:是指兩個以上的事務分别請求封鎖對方已經封鎖的資料,導緻長期等待而無法繼續運作下去的現象。
預防封鎖:一次封鎖法和順序封鎖法。
解決死鎖:DBMS的并發控制子系統一旦檢測到系統中存在死鎖,就要設法解除。通常采用的方法是選擇一個處理死鎖代價最小的事務,将其撤消,釋放此事務持有的所有的鎖,使其它事務得以繼續運作下去。當然,對撤消的事務所執行的資料修改操作必須加以恢複。
11.3.6 多粒度封鎖協定(了解一下P517)
11.4 資料庫的備份與恢複
11.4.1 資料庫系統故障種類
1.事務故障:由于程式執行錯誤引起事務非預期的、異常終止的故障,通常來源主要有邏輯錯誤(非法輸入、找不到資料、溢出、超出資源限制等)和系統錯誤(比如死鎖),事務故障由DBMS系統來實作故障恢複,通過撤銷事務(UNDO)來強行復原該事務操作。
2.系統故障:是指硬體故障、軟體(如DBMS、OS或者應用程式)漏洞的影響下,導緻丢失了記憶體中的資訊,影響正在執行的事務,機關破壞存儲在外存儲上的資訊。
3.媒體故障:是指資料庫的存儲媒體發生故障,如磁盤損壞、瞬間強磁場幹擾等,這種故障破壞了資料庫,會影響到所有正在讀取這部分資料的事務。
11.4.2 資料庫備份
資料轉出是将資料庫自制到另一個磁盤或錄音帶上儲存起來,也就是資料備份。
1.靜态轉儲和動态轉儲:靜态轉儲是指轉出期間不允許對資料庫進行任何存取修改操作;動态轉儲是在轉出期間允許對資料庫進行存取、修改操作,是以轉出和使用者事務可以并發執行。
2.海量轉儲和增量轉儲:海量轉儲就是全量備份,增量轉儲就是每次隻轉儲自上次轉儲後更新過的資料。
3.日志檔案:在事務處理的過程中,DBMS把事務開始、事務結束以及對資料庫的增删改的每一次操作寫入日志檔案。DBMS可以利用日志檔案進行事務故障和系統故障的恢複,并可與備份檔案實作媒體故障恢複。
4.資料庫鏡像:也就是資料庫複制。
11.4.3 資料庫恢複
資料庫恢複主要通過**備援資料**(資料庫備份檔案和日志檔案)來實作。
1.故障恢複操作
故障恢複的兩個操作:UNDO和REDO。
(1)UNDO(撤銷事務):将資料庫恢複到事務執行前的正确狀态(反向掃描日志檔案直至對應事務開始的辨別)。
(2)REDO(重做事務):将已送出的事務重新執行(正向掃描日志檔案直至對應事務結束的辨別)。
2.故障恢複政策(很重要)
(1)事務故障恢複:由系統自動完成,對使用者是透明的,通過UNDO操作使資料庫恢複到該事務執行前的正确狀态。
(2)系統故障恢複:在系統重新開機之後自動執行,對未完成的事務執行UNDO操作,對已送出未寫入資料庫的事務執行REDO操作。
(3)媒體故障恢複:資料庫需要重裝,通過故障前最後一次的備份和日志檔案,按照系統故障的恢複過程執行UNDO和REDO操作來實作恢複。
11.5 資料庫的安全性與完整性
1.安全性違例
惡意通路的形式主要包括:未經授權讀取資料(竊取資訊);未經授權修改資料;未經授權破壞資料。資料庫安全性是指保護資料庫不收惡意通路。保護資料庫安全,有五個層次上采取安全性措施:資料庫系統層次、作業系統層次、網絡層次、實體層次、人員層次。(了解一下即可)
2.授權、視圖
通過DBMA提供的授權功能賦予使用者在資料庫各個部分上的增删改查等權限;或者通過視圖隐藏使用者不需要看見的資料,限制使用者隻能通路所需資料。
3.審計追蹤
審計追蹤(Audit Trail)是一個對資料庫所有更改的日志,還包括哪個使用者執行了更改和什麼時候執行的更改等資訊。
4.資料加密
資料加密是計算機系統對資訊進行保護的一種最可靠的方法,按照作用不同,主要分為資料傳輸加密技術、資料存儲加密技術、資料完整性的鑒别技術和密鑰管理技術。
5.資料庫的完整性
資料庫的完整性是指資料的正确性和相容性,完整性限制條件作用的對象可以是表、行和列三種。
說明:
1.疏忽、遺漏、錯誤之處,歡迎留言批評指正。
2.第11章總結完畢,後續會繼續完善補充本章的曆年真題,轉載請注明出處,整理不易,謝謝!