国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據庫并發控制

2019-11-08 20:54:42
字體:
來源:轉載
供稿:網友

一、三類并發問題及四種事務隔離級別

首先介紹三類并發問題:

1.臟讀:一個事務讀到另一個事務未提交的更新數據(A和B事務并發執行,B事務執行更新后,A事務查詢B事務沒有提交的數據,B事務回滾,則A事務得到的數據不是數據庫中的真實數據。也就是臟數據,即和數據庫中不一致的數據)。 2.不可重復讀:一個事務讀到另一個事務已提交的更新數據(A和B事務并發執行,A事務查詢數據,然后B事務更新該數據,A再次查詢該數據時,發現該數據變化了)。 3.虛讀(幻讀):一個事務讀到另一個事務已提交的新插入的數據(A和B事務并發執行,A事務查詢數據,B事務插入或者刪除數據,A事務再次查詢發現結果集中有以前沒有的數據或者以前有的數據消失了)。

相應的有四種事務隔離級別供用戶選用:

臟讀 不可重復讀 幻讀
讀未提交 Y Y
讀提交 N Y
可重復讀 N N
串行化 N N

二、兩階段封鎖協議(2PL)及解決死鎖的方法

下面介紹兩階段封鎖協議(2PL)。2PL可以使事務的隔離級別達到可串行化。2PL要求每個事務分兩個階段提出加鎖和解鎖申請:

1.增長階段:事務可以獲得鎖,但是不能釋放鎖 2.縮減階段:事務可以釋放鎖,但是不能獲得鎖

一開始,事務處于增長階段,事務根據需要獲得鎖。一旦該事務釋放鎖,就進入縮減階段,不能再發出加鎖請求。我們可以證明2PL協議保證沖突可串行化。對于任何事務,在調度中該事務獲得其最后的加鎖位置(增長階段結束點)稱為事務的封鎖點。這樣,多個事務可以根據它們的封鎖點進行排序,實際上,這個順序就是事務的一個可串行化順序。但是,2PL不保證不發生死鎖,例如:

T3 T4
lock-X(B)read(B)B:=B-50write(B)
lock-S(A)read(A)lock-S(B)
lock-X(A)

*其中lock-X表示排它鎖,lock-S表示共享鎖此時,事務T3等待T4釋放A上的共享鎖,T4等待T3釋放B上的排他鎖,發生死鎖。死鎖的解決方法有兩種,一種是預防,一種是檢測與恢復。這里采用第二種方法,鎖的等待關系可以用有向圖來表示,如T3->T4表示T3等待T4釋放鎖。轉化為圖后,如果有向圖中有環,則有死鎖。這里使用NyaDB的死鎖檢測與恢復方法:

1.設置一個時間戳stamp = 0; 2.為每個點設置一個”訪問戳”, visStamp, 初始化為-1; 3.任意選擇一個visStamp為-1的點, 設它為s; 4.stamp++; 5.從s開始遍歷, 對每個遍歷到的點u進行下面的判斷: 6.===> 如果visStamp[u] == -1, 則visStamp[u] = stamp, 繼續遍歷; 7.===> 如果visStamp[u] != -1 and visStamp[u] < stamp, 跳過點u, 即不以它為節點繼續向下遍歷; 8.===> 如果visStamp[u] == stamp, 則有環, 結束算法; 9.當從s開始遍歷完且并沒發行環, 重復3), 直到沒有visStamp為-1的點. 10.當整個算法結束時, 都沒發現環, 則無環.

將等待圖維護在內存中, 每當出現等待時, 則向圖中加入一條邊。 每向圖中加入一條邊, 便進行一次死鎖檢測。 如果加入某條邊后檢測到了死鎖, 則撤銷加入這條邊的事務。

三、新的問題—級聯回滾

考慮如下圖的事務調度:

T5 T6 T7
lock-X(A)read(A)lock-S(B)read(B)write(A)unlock(A)
lock-X(A)read(A)write(A)unlock(A)
lock-S(A)read(A)

如果在事務T7的read(A)步驟之后事務T5發生故障需要回滾,此時雖然T6和T7并沒有發生故障,但是因為這兩個事務中有一部分命令是在事務T5開始到故障點之間執行的,所以也需要回滾,這就導致了級聯回滾。級聯回滾需要撤銷大量的工作,這是數據庫系統不希望見到的。可以通過將2PL協議變為嚴格2PL協議來避免級聯回滾。嚴格2PL協議不僅要求封鎖是兩階段的,還要求事務持有的所有排他鎖必須在事務提交之后才能釋放。這個要求保證了未提交事務所寫的任何數據在該事務提交之前均以排他鎖方式加鎖,防止了其他事務讀取這些數據。應用嚴格2PL協議的級聯回滾事務調度變成了下圖的樣子,防止了級聯回滾的出現:

T5 T6 T7
T5 beginslock-X(A)read(A)lock-S(B)read(B)write(A)unlock(A)…………release all lockT5 is finished
T6 beginslock-X(A)read(A)write(A)unlock(A)…………release all lockT6 is finished
T7 beginslock-S(A)read(A)…………release all lockT7 is finished

參考文獻:

1.NyaDB的技術文檔:https://qw4990.gitbooks.io/nyadb/content/chapter4.html2.數據庫系統概念(原書第5版) 第16章 并發控制


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南汇区| 莎车县| 东乡县| 连州市| 西宁市| 墨脱县| 天峻县| 汉沽区| 沂源县| 青海省| 宜都市| 万全县| 遂平县| 祁东县| 甘孜县| 镇巴县| 岳池县| 福鼎市| 佛学| 原阳县| 曲阜市| 章丘市| 收藏| 益阳市| 延庆县| 德江县| 阿拉善盟| 北川| 桦川县| 普兰店市| 龙岩市| 兴宁市| 海南省| 涿州市| 阜阳市| 长武县| 石城县| 买车| 松江区| 随州市| 双柏县|