事務四種隔離級別分析.doc_第1頁
事務四種隔離級別分析.doc_第2頁
事務四種隔離級別分析.doc_第3頁
事務四種隔離級別分析.doc_第4頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

數(shù)據(jù)庫事務四種隔離級別詳述大多數(shù)事務系統(tǒng)使用的SQL標準中定義了四種隔離級別:可串行化、不可重復都、讀已提交和讀未提交。我們通過下面的這個例子來對這四種隔離級別進行詳細的說明。場景:假如資源庫里有兩個包,分別是加鎖包和多步提交包,其中加鎖包中的文件個數(shù)是7個,而多步提交包中的文件個數(shù)是5個。現(xiàn)在Martin將要統(tǒng)計資源目錄中的所有包的個數(shù),而同時,David要向資源庫里更新包的個數(shù),即David將要向加鎖包里再提交2個文件,向多步提交包里在提交3個文件。由于,Martin的統(tǒng)計和David的更新是并發(fā)執(zhí)行的,所以,下面將描述在使用某種隔離級別的情況下,會出現(xiàn)什么樣的結果??纱谢簣?zhí)行情況是要不Martin先統(tǒng)計,統(tǒng)計完成后David再統(tǒng)計,或者David更新完成后,Martin再更新。這樣,系統(tǒng)保證Martin的結果不是12或17,它們都是正確的,但是可串行化可能無法保證同樣條件下多次運行后會得到相同的結果。第一次運行Martin統(tǒng)計的結果是12,第二次統(tǒng)計的結果就變成了17。讀已提交:它允許不可重復讀。不可重復讀的大致意思是,你第一次讀取的數(shù)據(jù)假如是A,由于外界的干擾,那你在使用相同條件第二次讀取的數(shù)據(jù)將會覆蓋掉第一次讀取的數(shù)據(jù),即先前讀取的結果A將不可重現(xiàn)。以上面場景為例,假如Martin從加鎖包里讀取的文件數(shù)是7,接著,David提交了更新,這時,Martin再從加鎖包里讀取文件個數(shù),則得出的結果變成了9,以前的7將不可重現(xiàn)??芍貜妥x的概念和不可重復讀概念相反,即如果允許可重復讀,則即使David提交了更新,Martin從加鎖包里讀出的文件個數(shù)還是7??芍貜妥x:可重復讀的概念在上面介紹了,可重復讀可能會出現(xiàn)幻讀。至于幻讀,還是可以用上面例子來描述:首先,Martin從加鎖包里讀出7個文件,這時,David提交了更新(另一個事務),Martin又從多步提交包里讀出8個文件,于是統(tǒng)計得出了一個錯誤的結果,即7+8=15。出現(xiàn)幻讀的原因是讀的結果只對Martin事務一部分有效,而不是對整個事務有效,而且通常是由于插入數(shù)據(jù)造成的。讀未提交:最低的隔離界別??赡軙霈F(xiàn)幻讀、臟讀以及不可重復讀等。在這種隔離級別下,允許一個事務讀取其它事務還未提交的數(shù)據(jù)。例如:Martin可能會在David剛往加鎖包中添加完文件還沒向多步提交包中添加文件時,就統(tǒng)計了David往加鎖包中添加的文件,即統(tǒng)計結果為2+7+5=14。而此時,David事務并沒提交,假如David更新成功,成功提交了事務,統(tǒng)計結果應該為17,或者David更新失敗,事務回滾,統(tǒng)計結果應該為12。DB2四種隔離級別(Isolation Levels)詳解維護數(shù)據(jù)庫的一致性和數(shù)據(jù)完整性,同時又允許多個應用程序同時訪問同一數(shù)據(jù),這樣的特性稱為并發(fā)性。DB2數(shù)據(jù)庫用來嘗試強制實施并發(fā)性的方法之一是通過使用隔離級別,它決定在第一個事務訪問數(shù)據(jù)時,如何對其他事務鎖定或隔離該事務所使用的數(shù)據(jù)。DB2使用下列隔離級別來強制實施并發(fā)性: 可重復讀(Repeatable Read) 讀穩(wěn)定性(Read Stability) 游標穩(wěn)定性(Cursor Stability) 未提交讀(Uncommitted Read)可重復讀隔離級別可以防止所有現(xiàn)象,但是會大大降低并發(fā)性(可以同時訪問同一資源的事務數(shù)量)。未提交讀隔離級別提供了最大的并發(fā)性,但是“臟讀”、“幻像讀”和“不可重復讀”都可能出現(xiàn)。默認的隔離級別是CS。10.3.1 可重復讀(RRRepeatable Read)可重復讀隔離級別是最嚴格的隔離級別。在該隔離級別下,一個事務的影響完全與其他并發(fā)事務隔離,臟讀、不可重復的讀、幻像讀現(xiàn)象都不會發(fā)生。當使用可重復讀隔離級別時,在事務執(zhí)行期間會鎖定該事務以任何方式引用的所有行。因此,如果在同一個事務中發(fā)出同一個SELECT語句兩次或更多次,那么產(chǎn)生的結果數(shù)據(jù)集總是相同的。因此,使用可重復讀隔離級別的事務可以多次檢索同一行集,并對它們執(zhí)行任意操作,直到提交或回滾操作終止該事務。但是,在事務存在期間,不允許其他事務執(zhí)行會影響這個事務正在訪問的任何行的插入、更新或刪除操作。為了確保這種行為不會發(fā)生,鎖定該事務所引用的每一行 而不是僅鎖定被實際檢索或修改的那些行。因此,如果一個事務掃描了1000行,但只檢索10行,那么它所掃描的1000行(而不僅是被檢索的10行)都會被鎖定。那么在現(xiàn)實環(huán)境中可重復讀隔離級別是如何工作的呢?假定如家酒店使用DB2數(shù)據(jù)庫跟蹤如家酒店的客房信息,包括房間預訂和房價信息,還有一個基于Web的應用程序,它允許顧客按“先到先服務”的原則預訂房間。如果旅館預訂應用程序是在可重復讀隔離級別下運行的,當顧客掃描某個日期段內(nèi)的可用房間列表時,您(旅館經(jīng)理)將無法更改那些房間在指定日期范圍內(nèi)的房價。同樣,其他顧客也無法進行或取消將會更改該列表的預訂(直到第一個顧客的事務終止為止)。圖10-6說明了這種行為。 圖10-6 可重復讀隔離級別的示例在使用可重復讀隔離級別時,一個事務中所有被讀取過的行上都會被加上S鎖,直到該事務被提交或回滾,行上的鎖才會被釋放。這樣可以保證在一個事務中即使多次讀取同一行,得到的值也不會改變。另外,在同一事務中即使以同樣的搜索標準重新打開已被處理過的游標,得到的結果集也不會改變??芍貜妥x相對于讀穩(wěn)定性而言,加鎖的范圍更大。對于讀穩(wěn)定性,應用程序只對符合要求的所有行加鎖;而對于可重復讀,應用程序將對所有被掃描過的行都加鎖。可重復讀(RR)會鎖定應用程序在工作單元中引用的所有行。利用“可重復讀”,在打開游標的相同工作單元內(nèi)一個應用程序發(fā)出一個SELECT語句兩次,每次都返回相同的結果。利用“可重復讀”,不可能出現(xiàn)丟失更新、臟讀和幻像讀的情況。在該工作單元完成之前,“可重復讀”應用程序可以盡可能多次地檢索和操作這些行。但是,在該工作單元完成之前其他應用程序均不能更新、刪除或插入可能會影響結果表的行?!翱芍貜妥x”應用程序不能查看其他應用程序的未落實更改。10.3.2 讀穩(wěn)定性(RSRead Stability)讀穩(wěn)定性隔離級別沒有可重復讀隔離級別那么嚴格;因此,它沒有將事務與其他并發(fā)事務的效果完全隔離。讀穩(wěn)定性隔離級別可以防止臟讀和不可重復讀,但是可能出現(xiàn)幻像讀。在使用這個隔離級別時,只是鎖定事務實際檢索和修改的行。因此,如果一個事務掃描了1000行,但只檢索10行,則只有被檢索的10行(而不是所掃描的1000行)被鎖定。因此,如果在同一個事務中發(fā)出同一個SELECT語句兩次或更多次,那么每次產(chǎn)生的結果數(shù)據(jù)集可能不同。與可重復讀隔離級別一樣,在讀穩(wěn)定性隔離級別下運行的事務可以檢索一個行集,并可以對它們執(zhí)行任意操作,直到事務終止。在這個事務存在期間,其他事務不能執(zhí)行那些會影響這個事務檢索到的行集的更新或刪除操作;但是其他事務可以執(zhí)行插入操作。如果插入的行與第一個事務的查詢的選擇條件匹配,那么這些行可能作為幻像出現(xiàn)在后續(xù)產(chǎn)生的結果數(shù)據(jù)集中。其他事務對其他行所作的更改,在提交之前是不可見的。那么,讀穩(wěn)定性隔離級別會如何影響如家酒店客房預定應用程序的工作方式呢?當一個顧客檢索某個日期段內(nèi)的所有可用房間列表時,您可以更改這個顧客的列表之外的任何房間的房價。同樣,其他顧客可以進行或取消房間預訂。如果第一個顧客再次運行同樣的查詢,其他顧客的操作可能會影響他獲得的可用房間列表。如果第一個顧客再次查詢同一個日期段內(nèi)的所有可用房間列表,產(chǎn)生的列表中有可能包含新的房價或第一次產(chǎn)生列表時不可用的房間。圖10-7 說明了這種行為。 圖10-7 讀穩(wěn)定性隔離級別的示例在使用讀穩(wěn)定性隔離級別時,一個事務中所有被讀取過的行上都會被加上NS鎖,直到該事務被提交或回滾,行上的鎖才會被釋放。這樣可以保證在一個事務中即使多次讀取同一行,得到的值也不會改變。但是,如果使用這種隔離級別,在一個事務中,如果使用同樣的搜索標準重新打開已被處理過的游標,則結果集可能改變(可能會增加某些行,這些行被稱為幻影行 (Phantom)。這是因為RS隔離級不能阻止通過插入或更新操作在結果集中加入新行)。讀穩(wěn)定性(RS)只鎖定應用程序在工作單元中檢索的那些行。它確保在某個工作單元完成之前,在該工作單元運行期間的任何限定行讀取不被其他應用程序進程更改,且確保不會讀取由另一個應用程序進程所更改的任何行,直至該進程落實了這些更改。也就是說,不可能出現(xiàn)“不可重復讀”情形?!白x穩(wěn)定性”隔離級別的其中一個目標是提供較高并行性以及數(shù)據(jù)的穩(wěn)定視圖。為了有助于達到此目標,優(yōu)化器確保在發(fā)生鎖定升級前不獲取表級鎖定。“讀穩(wěn)定性”隔離級別最適用于包括下列所有特征的應用程序: 在并發(fā)環(huán)境下運行 須要限定某些行在工作單元運行期間保持穩(wěn)定 在工作單元中不會多次發(fā)出相同的查詢,或者在同一工作單元中發(fā)出多次查詢時并不要求該查詢獲得相同的回答10.3.3 游標穩(wěn)定性(CSCursor Stability)游標穩(wěn)定性隔離級別在隔離事務效果方面非常寬松。它可以防止臟讀,但有可能出現(xiàn)不可重復讀和幻像讀。這是因為在大多數(shù)情況下,游標穩(wěn)定性隔離級別只鎖定事務聲明并打開的游標當前所引用的行。當使用游標穩(wěn)定性隔離級別的事務通過游標從表中檢索行時,其他事務不能更新或刪除游標所引用的行。但是,如果被鎖定的行本身不是用索引訪問的,那么其他事務可以將新的行添加到表中,以及對被鎖定行前后的行進行更新和/或刪除操作。所獲取的鎖一直有效,直到游標重定位或事務終止為止(如果游標重定位,原來行上的鎖就被釋放,并獲得游標現(xiàn)在所引用行上的鎖)。此外,如果事務修改了它檢索到的任何行,那么在事務終止之前,其他事務不能更新或刪除該行,即使游標不再位于被修改的行。與可重復讀和讀穩(wěn)定性隔離級別一樣,其他事務在其他行上進行的更改,在這些更改提交之前對于使用游標穩(wěn)定性隔離級別(這是默認的隔離級別)的事務是不可見的。如果如家酒店客房預定程序在游標穩(wěn)定性隔離級別下運行,那么會有什么影響呢?當一個顧客檢索某個日期段內(nèi)所有可用房間的列表,然后查看產(chǎn)生的列表上每個房間的信息時(每次查看一個房間),您可以更改旅館中任何房間的房價,但是這個顧客當前正在查看的房間除外(對于指定的日期段)。同樣,其他顧客可以對任何房間進行或取消預訂,但是這個顧客當前正在查看的房間除外(對于指定的日期段)。也就是說,對于第一個顧客當前正在查看的房間記錄,您和其他顧客都不能進行任何操作。當?shù)谝粋€顧客查看列表中另一個房間的信息時,您和其他顧客就可以修改他剛才查看的房間記錄(如果這個顧客沒有預訂這個房間的話)。圖10-8說明了這種行為。 圖10-8 游標穩(wěn)定性隔離級別的示例在使用游標穩(wěn)定性隔離級別時,一個事務的結果集中只有正在被讀取的那一行(游標指向的行)會被加上NS鎖,其他未被處理的行上不被加鎖。這種隔離級別只能保證正在被處理的行的值不會被其他并發(fā)的程序所改變。該隔離級別是DB2默認的隔離級別。當在行上定位游標時,游標穩(wěn)定性(CS)會鎖定任何由應用程序的事務所訪問的行。此鎖定在讀取下一行或終止事務之前有效。但是,如果更改了某一行上的任何數(shù)據(jù),那么在對數(shù)據(jù)庫落實更改之前必須掛起該鎖定。對于具有“游標穩(wěn)定性”的應用程序已檢索的行,當該行上有任何可更新的游標時,任何其他應用程序都不能更新或刪除該行?!坝螛朔€(wěn)定性”應用程序不能查看其他應用程序的未落實更改。使用“游標穩(wěn)定性”隔離級別,可能會出現(xiàn)不可重復讀和幻像讀現(xiàn)象?!坝螛朔€(wěn)定性”是默認隔離級別,建議在需要最大并行性,但只看到其他應用程序中已落實行的情況下才使用。10.3.4 未提交讀(URUncommitted Read)未提交讀隔離級別是最不嚴格的隔離級別。實際上,在使用這個隔離級別時,僅當另一個事務試圖刪除或更改被檢索的行所在的表時,才會鎖定該檢索的行。因為在使用這種隔離級別時,行通常保持未鎖定狀態(tài),所以臟讀、不可重復讀和幻像讀都可能會發(fā)生。因此,未提交讀隔離級別通常用于那些訪問只讀表和視圖的事務,以及某些執(zhí)行SELECT語句的事務(只要其他事務的未提交數(shù)據(jù)對這些語句沒有負面效果)。顧名思義,其他事務對行所作的更改在被提交之前對于使用未提交讀隔離級別的事務是可見的。但是,此類事務不能看見或訪問其他事務所創(chuàng)建的表、視圖或索引,直到那些事務被提交為止。類似地,如果其他事務刪除了現(xiàn)有的表、視圖或索引,那么僅當進行刪除操作的事務終止時,使用未提交讀隔離級別的事務才能知道這些對象不再存在了(一定要注意一點:當運行在未提交讀隔離級別下的事務使用可更新游標時,該事務的行為和在游標穩(wěn)定性隔離級別下運行一樣,并應用游標穩(wěn)定性隔離級別的約束)。那么未提交讀隔離級別對如家酒店客房預定應用程序有什么影響呢?現(xiàn)在,當一個顧客檢索某個日期段內(nèi)的所有可用房間列表時,您可以更改旅館中任何房間在任何日期的房價,而其他顧客也可以對任何房間進行或取消預訂,包括第一個顧客當前正在查看的房間記錄(對于指定的日期段)。另外,第一個顧客生成的房間列表可能包含其他顧客正在預訂(因此實際上不可用)的房間。圖10-9說明了這種行為。 圖10-9 未提交讀隔離級別示例未提交讀(UR)允許應用程序訪問其他事務的未提交的更改。除非其他應用程序嘗試刪除或改變該表,否則該應用程序不會鎖定正讀取的行而使其他應用程序不能訪問該行。對于只讀和可更新的游標,“未提交的讀”的工作方式有所不同。在使用未提交讀隔離級別時,對于只讀操作,不加行鎖。典型的只讀操作包括: SELECT語句的結果集(比如語句中包括ORDER BY子句);定義游標時指明FOR FETCH ONLY。未提交讀隔離級別可以改善應用程序的性能,同時可以最大程度地允許并發(fā)。但是,應用程序的數(shù)據(jù)完整性將受到威脅。如果需要讀取未提交的數(shù)據(jù),該隔離級是唯一選擇。只

溫馨提示

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

評論

0/150

提交評論