這裏寫自定義目錄標題
事務的概念
事務是【數據庫管理系統】提供的控制【數據操作】的一種手段,通過這一手段,應用程序員將一系列的數據庫操作組合在一起作爲一個整體進行操作和控制,以便數據庫管理系統能夠提供一致性狀態轉換的保證
read(X)是從數據庫傳送數據項X到事務的工作區中
write(X)是從事務的工作區中將數據項X寫回數據庫
事務的宏觀性和微慣性
事務的宏觀性(應用程序員看到的事務):一個存取或改變數據庫內容的程序的一次執行,或者說一條/多條SQL語句的一次執行被看作一個事務
事務一般是由應用程序員提出,因此有開始和結束,結束前需要提交或撤銷
一個事務可以處理一個數據 / 一條記錄
複雜一些的事務也可能處理一批數據或一批記錄
一段程序語句,可能會循環執行,執行中,由SQL語句引出事務,至Commit / RollBack 結束事務
,每次重複執行都將產生一個事務,循環多少次將產生多少個事務
更爲複雜的事務是由多條SQL語句構成的
事務的宏觀性(DBMS看到的事務):對數據庫的一系列基本操作(讀,寫)的一個整體性執行
事務的特性
三種不正確的次序安排則引發了不一致性
不一致性的三種情況
1、丟失修改(宏觀)
兩個T都是獨立且完整的
2、不能重複讀 (微觀)
3、髒讀 (微觀)
微觀交錯執行
事務的特性:ACID
1、原子性:DBMS能夠保證事務的一組更新操作是原子不可分的,即對BD而言,要麼全做,要麼全不做
2、一致性:DBMS保證事務的操作狀態是正確的,符合一致性的操作規則,不能出現三種典型的不一致性,它是進一步由隔離性來保證的
3、隔離性:DBMS保證併發執行的多個事務之間互相不受影響,例如兩個事務T1和T2,即使併發執行,也相當於或者先執行了T1,再執行T2。或者先執行了T2,再執行T1
4、持久性:DBMS保證已提交事務的影響是持久的(永久寫到了磁盤上),被撤銷事務的影響是可恢復的。(撤銷對磁盤內容無影響)
併發控制(一致性,隔離性) 故障恢復(原子性、持久性)
換句話說:具有ACID特性的若干數據庫基本操作的組合體被稱爲事務
DBMS對事務的控制
事務調度與可串行性
併發調度的正確性 ⊇ 可串行性 ⊇ 衝突可串行性
事務調度:一組事務的基本步(讀,寫,其他控制操作如加鎖,解鎖等)的一種執行順序稱爲對這組事務的一個調度。
併發(或並行)調度:多個事務從宏觀上看是並行執行的,但其微觀上的基本操作(讀,寫)則是交叉執行
的
(1)基本概念
併發調度的正確性: 當且僅當在這個併發調度下所得到的新數據庫結果與分別串行地運行這些事務所得到的新數據庫完全一致,則說調度是正確的
可串行性: 不管數據庫初始狀態如何,一個調度對數據庫狀態的影響都和某個串行調度相同,則我們說這個調度是可串行化的 / 具有可串行性
(串行調度是正確的 ,不可串行化調度是錯誤的,2可串行化正確的)
可串行化調度一定是正確的並行調度,但正確的並行調度,卻未必都是可串行化的調度
可串行化調度定義要嚴格
並行調度的正確性是指【內容上】結果正確性,而可串行性是指【形式上】結果正確性,便於操作(如右側圖3 中T2的B=B-20改爲B=B-0,則調度是正確的,但是不可串行化)
對更改後的圖3來說,T1T2一起執行和T1和T2分別串行這些事務所得到的新數據庫完全一致
(2)一種簡單的事務調度的標記模型
(3)衝突可串行性
衝突: 調度中一對連續的動作,它們滿足:如果它們的順序交換,那麼涉及的事務中至少有一個事務的行爲會改變
(有衝突的兩個操作
是不能交換次序的,沒有衝突的兩個事務
是可交換的)
幾種衝突的情況:
1、同一事物的任何兩個操作都是衝突的
ri(X) ; wi(Y) wi (X) ; ri(Y)
2、不同事務對同一元素的兩個寫操作是衝突的
wi(X) ; wj(X)
3、不同事務對同一元素的一讀一寫操作是衝突的
wi(X) ; rj(X) ri(X) ; wj(X)
衝突可串行性:
一個調度,如果通過交換相鄰
兩個無衝突
的操作能夠轉換
到某一個串行
的調度,則稱此調度爲衝突可串行化的調度
(不同事務寫的不同的元素,是可以交換的)
衝突可串行性是比可串行性要嚴格的概念
滿足衝突可串行性,一定滿足可串行性,反之不然
衝突可串行性判別算法
構造圖 ,判斷是否有環
①構造一個前驅圖(有向圖)
②結點是每一個事務Ti ,如果 Ti 的一個操作與 Tj 的一個操作發生衝突,且 Ti 在 Tj 前執行,則繪製一條邊, 由 Ti 指向 Tj, 表徵 Ti 要在 Tj 前執行
③測試檢查:如果此有向圖沒有環,則是衝突可串行化的
(不同事務對同一數據元素進行讀 / 寫
,是有衝突的)
基於【封鎖】的併發控制方法
鎖: 是控制併發的一種手段
①每一數據元素都有唯一
的鎖
②每一事務讀寫
數據元素前
,要獲得鎖
③如果被其他事務持有該元素的鎖,則要等待
④事務處理完成後要釋放鎖
鎖本身並不能保證衝突可串行性
鎖爲調度提供了控制的手段。但如何用鎖,仍需說明 ——不同的協議
封鎖協議之鎖的類型
排他鎖X:只有一個
事務能讀、寫
,其他任何事務都不能讀、寫
共享鎖S:所有事務都可以讀
,但任何事務都不能寫
更新鎖U:初始讀,以後可以升級爲寫
增量鎖 I :增量更新(A=A+x),區分增量更新和其他類型的更新
封鎖協議之相容性矩陣
封鎖協議之加鎖/解鎖時機
封鎖協議之封鎖粒度
鎖的小結
兩段封鎖協議
兩段封鎖協議: 是一種基於鎖的併發控制方法
讀寫數據之前要獲得鎖,每個事務中所有封鎖請求先於任何一個解鎖請求
兩階段: 加鎖段,解鎖段。
(加鎖段中不能有解鎖操作,解鎖段中不能有枷鎖操作)
若先執行T1 在執行T2
兩端封鎖協議是可以保證衝突可串行性的
封鎖是每個元素有一把鎖,一個事物對一個元素進行操作前,要先對該元素加鎖,在執行完後,對元素進行解鎖
封鎖不能保證併發調度不會出現問題
1級
可以防止丟失修改
2級
防止丟失修改
和髒讀
3級
防止丟失修改
,髒讀
和不允許重複讀
封鎖協議需要考慮怎麼樣纔可以保證併發調度不出現問題,有四種類型的鎖X, S, U, I
四種鎖,這四種鎖可以通過鎖矩陣
來判斷怎麼使用來保證可串行性
,不過封鎖協議也可能會出現死鎖
的問題。