數(shù)據(jù)庫事務(wù)和鎖的詳解_第1頁
已閱讀1頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、.提供的數(shù)據(jù)庫事務(wù)隔離級別System.Data.IsolationLevel枚舉用于指定連接的事務(wù)鎖定行為,它包含如下枚舉:成員名稱成員名稱說明說明Chaos無法改寫隔離級別更高的事務(wù)中的掛起的更改。ReadCommitted在正在讀取數(shù)據(jù)時保持共享鎖,以避免臟讀,但是在事務(wù)結(jié)束之前可以更改數(shù)據(jù),從而導(dǎo)致不可重復(fù)的讀取或幻像數(shù)據(jù)。ReadUncommitted可以進行臟讀,意思是說,不發(fā)布共享鎖,也不接受獨占鎖。RepeatableR

2、ead在查詢中使用的所有數(shù)據(jù)上放置鎖,以防止其他用戶更新這些數(shù)據(jù)。防止不可重復(fù)的讀取,但是仍可以有幻像行。Serializable在DataSet上放置范圍鎖,以防止在事務(wù)完成之前由其他用戶更新行或向數(shù)據(jù)集中插入行。Snapshot通過在一個應(yīng)用程序正在修改數(shù)據(jù)時存儲另一個應(yīng)用程序可以讀取的相同數(shù)據(jù)版本來減少阻止。表示您無法從一個事務(wù)中看到在其他事務(wù)中進行的更改,即便重新查詢也是如此。Unspecified正在使用與指定隔離級別不同的隔

3、離級別,但是無法確定該級別。當使用OdbcTransaction時,如果不設(shè)置IsolationLevel或者將IsolationLevel設(shè)置為Unspecied,事務(wù)將根據(jù)基礎(chǔ)ODBC驅(qū)動程序的默認隔離級別來執(zhí)行。說心里話,平時就是照著例子代碼抄,也沒理會這些值。不過要想真的理解并能靈活運用,看MSDN的解釋估計感到困惑的不只我一個。從今天起,我決定要把這些值的真正含義搞清楚。首先,還是要去研究一下SQLServer的鎖機制:SQL

4、SERVER鎖的機制SQLserver的所有活動都會產(chǎn)生鎖。鎖定的單元越小,就越能越能提高并發(fā)處理能力,但是管理鎖的開銷越大。如何找到平衡點,使并發(fā)性和性能都可接受是SQLServer的難點。SQLServer有如下幾種瑣:1、共享鎖用于只讀操作(),鎖定共享的資源。共享鎖不會阻止其他用戶讀,但是阻止其他的用戶寫和修改。2、更新鎖更新鎖是一種意圖鎖,當一個事務(wù)已經(jīng)請求共享瑣后并試圖請求一個獨占鎖的時候發(fā)生更新瑣。例如當兩個事務(wù)在幾行數(shù)據(jù)

5、行上都使用了共享鎖,并同時試圖獲取獨占鎖以執(zhí)行更新操作時,就發(fā)生了死鎖:都在等待對方釋放共享鎖而實現(xiàn)獨占鎖。更新鎖的目的是只讓一個事務(wù)獲得更新鎖,防止這種情況的發(fā)生。3、獨占鎖一次只能有一個獨占鎖用在一個資源上,并且阻止其他所有的鎖包括共享縮。寫是獨占鎖,可以有效的防止’臟讀’。數(shù)據(jù)的情況下并行訪問問題就變得復(fù)雜起來了。顯然,數(shù)據(jù)庫通常只允許唯一用戶一次修改特定的數(shù)據(jù)。當某一用戶開始修改某塊數(shù)據(jù)時,SQLServer能很快地鎖定數(shù)據(jù),阻

6、止其他用戶對這塊數(shù)據(jù)進行更新,直到修改該數(shù)據(jù)的第一位用戶完成其操作并提交交易或者回滾。但是,當某一位用戶正在修改某塊數(shù)據(jù)時假設(shè)另一位用戶又正想查詢該數(shù)據(jù)的信息時會發(fā)生什么情況呢?2、通常情況下,一個連接在修改數(shù)據(jù)塊時別的連接也不能查詢這個數(shù)據(jù)塊,直到解鎖。反之亦然:讀的時候不能寫和修改。這個方案會降低系統(tǒng)的性能和效率,盡管現(xiàn)在是行級鎖(7.0以前是鎖頁甚至是鎖表),如果你一次修改多行數(shù)據(jù),SQLServer則會把數(shù)據(jù)鎖定范圍提升到頁級別

7、乃至鎖定整個數(shù)據(jù)表,從而不必針對每一記錄跟蹤和維護各自的數(shù)據(jù)鎖,這樣能加快修改的速度,消耗小的服務(wù)器資源,但是并發(fā)性就差了。3、一個連接寫的時候,另一個連接可以寫,但是不得讀4、多個連接可以同時讀同一行。所以鎖發(fā)生在讀、寫的競爭上。5、設(shè)置事務(wù)的級別SETTRANSACTIONISOLATIONLEVELA、READCOMMITTED:指定在讀取數(shù)據(jù)時控制共享鎖以避免臟讀,但數(shù)據(jù)可在事務(wù)結(jié)束前更改,從而產(chǎn)生不可重復(fù)讀取或幻像數(shù)據(jù)。該選項

8、是SQLServer的默認值。B、READUNCOMMITTED:執(zhí)行臟讀或0級隔離鎖定,這表示不發(fā)出共享鎖,也不接受排它鎖。當設(shè)置該選項時,可以對數(shù)據(jù)執(zhí)行未提交讀或臟讀;在事務(wù)結(jié)束前可以更改數(shù)據(jù)內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)集消失。這是四個隔離級別中限制最小的級別。C、REPEATABLEREAD:鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新數(shù)據(jù),但是其他用戶可以將新的幻像行插入數(shù)據(jù)集,且幻像行包括在當前事務(wù)的后續(xù)讀取中。因為

9、并發(fā)低于默認隔離級別,所以應(yīng)只在必要時才使用該選項。D、SERIALIZABLE:在數(shù)據(jù)集上放置一個范圍鎖,以防止其他用戶在事務(wù)完成之前更新數(shù)據(jù)集或?qū)⑿胁迦霐?shù)據(jù)集內(nèi)。這是四個隔離級別中限制最大的級別。因為并發(fā)級別較低,所以應(yīng)只在必要時才使用該選項。該選項的作用與在事務(wù)內(nèi)所有語句中的所有表上設(shè)置HOLDLOCK相同。注釋一次只能設(shè)置這些選項中的一個,而且設(shè)置的選項將一直對那個連接保持有效,直到顯式更改該選項為止。這是默認行為,除非在語句的

10、FROM子句中在表級上指定優(yōu)化選項。SETTRANSACTIONISOLATIONLEVEL的設(shè)置是在執(zhí)行或運行時設(shè)置,而不是在分析時設(shè)置。術(shù)語解釋:在一個程序中,依據(jù)事務(wù)的隔離級別將會有三種情況發(fā)生?!襞K讀:一個事務(wù)會讀進還沒有被另一個事務(wù)提交的數(shù)據(jù),所以你會看到一些最后被另一個事務(wù)回滾掉的數(shù)據(jù)?!糇x值不可復(fù)現(xiàn):一個事務(wù)讀進一條記錄,另一個事務(wù)更改了這條記錄并提交完畢,這時候第一個事務(wù)再次讀這條記錄時,它已經(jīng)改變了?!艋糜白x:一個事務(wù)

溫馨提示

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

評論

0/150

提交評論