事務(wù)隔離級別_第1頁
事務(wù)隔離級別_第2頁
事務(wù)隔離級別_第3頁
事務(wù)隔離級別_第4頁
事務(wù)隔離級別_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、事務(wù)隔離級別 在JDBC操作中,為了有效保證并發(fā)讀取數(shù)據(jù)的正確性,提出的事務(wù)隔離級別的概念。 問題的提出 :數(shù)據(jù)庫是要被廣大客戶所共享訪問的,那么在數(shù)據(jù)庫操作過程中很可能出現(xiàn)以下幾種不確定情況。 更新丟失(Lost update):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),但是第二個(gè)事務(wù)卻中途失敗退出,導(dǎo)致對數(shù)據(jù)的兩個(gè)修改都失效了。這是因?yàn)橄到y(tǒng)沒有執(zhí)行任何的鎖操作,因此并發(fā)事務(wù)并沒有被隔離開來。 臟讀(Dirty Reads):一個(gè)事務(wù)開始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時(shí)提交。這是相當(dāng)危險(xiǎn)的,因?yàn)楹芸赡芩械牟僮鞫急换貪L。 不可重復(fù)讀(Non-repeatable Reads)

2、:一個(gè)事務(wù)對同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。例如,在兩次讀取的中途,有另外一個(gè)事務(wù)對該行數(shù)據(jù)進(jìn)行了修改,并提交。 兩次更新問題(Second lost updates problem):無法重復(fù)讀取的特例。有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù),然后其中一個(gè)對它進(jìn)行修改提交,而另一個(gè)也進(jìn)行了修改提交。這就會(huì)造成第一次寫操作失效。 幻讀(Phantom Reads):事務(wù)在操作過程中進(jìn)行兩次查詢,第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因?yàn)樵趦纱尾樵冞^程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的。 解決方案:為了避免上面出現(xiàn)的幾種情況,在標(biāo)準(zhǔn)SQ

3、L規(guī)范中,定義了4個(gè)事務(wù)隔離級別,不同的隔離級別對事務(wù)的處理不同。 未授權(quán)讀取,也稱為讀未提交(Read Uncommitted):允許臟讀取,但不允許更新丟失。如果一個(gè)事務(wù)已經(jīng)開始寫數(shù)據(jù),則另外一個(gè)數(shù)據(jù)則不允許同時(shí)進(jìn)行寫操作,但允許其他事務(wù)讀此行數(shù)據(jù)。該隔離級別可以通過“排他寫鎖”實(shí)現(xiàn)。 授權(quán)讀取,也稱為讀提交(Read Committed):允許不可重復(fù)讀取,但不允許臟讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問該行。 可重復(fù)讀?。≧epeatable Read):禁止不可重復(fù)讀取和臟讀取,但是有時(shí)可

4、能出現(xiàn)幻影數(shù)據(jù)。這可以通過“共享讀鎖”和“排他寫鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其他事務(wù)。 序列化(Serializable):提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過“行級鎖”是無法實(shí)現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問到。 隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大。對于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級別設(shè)為Read Committed,它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、虛讀和第

5、二類丟失更新這些并發(fā)問題,在可能出現(xiàn)這類問題的個(gè)別場合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。關(guān)于可重復(fù)讀:問題:“可重復(fù)讀”一般被解釋成“是個(gè)事務(wù)多次讀取數(shù)據(jù),讀的結(jié)果一致,不會(huì)讀到別的事務(wù)提交的數(shù)據(jù)”。 請問:這個(gè)解釋真的正確嗎?1 是另一個(gè)事務(wù)提交了,這個(gè)事務(wù)讀不到,還是說:2 在這個(gè)事務(wù)沒有還沒有commit之前,另外一個(gè)事務(wù)不能進(jìn)行update,insert,delete操作?答案是 1 還是 2?或者都不是,請高手賜教了。 答案是2可重復(fù)讀隔離級別是最嚴(yán)格的隔離級別。在該隔離級別下,一個(gè)事務(wù)的影響完全與其他并發(fā)事務(wù)隔離,臟讀、不可重復(fù)的讀、幻像讀現(xiàn)象都不會(huì)發(fā)生。當(dāng)使用可重復(fù)讀隔離

6、級別時(shí),在事務(wù)執(zhí)行期間會(huì)鎖定該事務(wù)以任何方式引用的所有行。因此,如果在同一個(gè)事務(wù)中發(fā)出同一個(gè)SELECT語句兩次或更多次,那么產(chǎn)生的結(jié)果數(shù)據(jù)集總是相同的。因此,使用可重復(fù)讀隔離級別的事務(wù)可以多次檢索同一行集,并對它們執(zhí)行任意操作,直到提交或回滾操作終止該事務(wù)。但是,在事務(wù)存在期間,不允許其他事務(wù)執(zhí)行會(huì)影響這個(gè)事務(wù)正在訪問的任何行的插入、更新或刪除操作。為了確保這種行為不會(huì)發(fā)生,鎖定該事務(wù)所引用的每一行- 而不是僅鎖定被實(shí)際檢索或修改的那些行。因此,如果一個(gè)事務(wù)掃描了1000行,但只檢索10行,那么它所掃描的1000行(而不僅是被檢索的10行)都會(huì)被鎖定。隔離級別中的重復(fù)讀是是指在第一次讀出數(shù)據(jù)

7、后 數(shù)據(jù)被修改了 但第二次去讀為保證數(shù)據(jù)一致,還是與第一次讀的一樣,這是比較高的隔離級別。還有一個(gè)比它高的幻影讀 是即使你添加列等操作都讀不出來轉(zhuǎn)載 微軟SQL Server事務(wù)隔離級別實(shí)例簡介作者:Edison Zhu  來源:博客園  發(fā)布時(shí)間:2009-11-12 23:56  閱讀:173 次  原文鏈接   收藏   源文:  數(shù)據(jù)庫的事務(wù)隔離級別(TRANSACTION ISOLATION LEVEL)是一個(gè)數(shù)據(jù)庫上很基本的一個(gè)概念。為什么會(huì)有

8、事務(wù)隔離級別,SQL Server上實(shí)現(xiàn)了哪些事務(wù)隔離級別?事務(wù)隔離級別的前提是一個(gè)多用戶、多進(jìn)程、多線程的并發(fā)系統(tǒng),在這個(gè)系統(tǒng)中為了保證數(shù)據(jù)的一致性和完整性,我們引入了事務(wù)隔離級別這個(gè)概念,對一個(gè)單用戶、單線程的應(yīng)用來說則不存在這個(gè)問題。首先,我們來看一下高并發(fā)的系統(tǒng)中會(huì)存在哪些問題,為了便于理解我們以張三在招商銀行的賬號和存款為例。一、準(zhǔn)備工作:1. 創(chuàng)建一個(gè)銀行賬號Table(只是為了說明問題,不考慮表的設(shè)計(jì)范式)CREATE TABLE dbo.BankAccount(   BankAccountId CHAR(16)    

9、   NOT NULL, - 銀行賬號   UserName      NVARCHAR(32)   NOT NULL, - 用戶   Balance       DECIMAL(19, 2) NOT NULL, - 余額   LastUpdate    SMALLDATETIME  NOT NULL)GO2. 準(zhǔn)備數(shù)據(jù)INSERT INTO db

10、o.BankAccount     VALUES ('9555500100071120', N'張三', 10000.00, GETDATE() - 北京分行賬號INSERT INTO dbo.BankAccount     VALUES ('9555507551227787', N'張三', 20000.00, GETDATE() - 深圳分行賬號GO3. 查看數(shù)據(jù)SELECT * FROM dbo.BankAccount二、應(yīng)用場景假設(shè)張三在招商銀

11、行開設(shè)了兩個(gè)賬號,一個(gè)是招商銀行北京分行,一個(gè)是招商銀行深圳分行,兩個(gè)賬號的余額分別是10,000和20,000。1. 張三在網(wǎng)上做了一筆交易,交易額100,買方小王通過銀行匯款100到張三的北京分行的賬號(見下面左圖),柜臺操作人員向張三賬號存入100(事務(wù)一),然后系統(tǒng)些操作日志(假設(shè)需要10秒,WAITFOR DELAY '00:00:10')正在此時(shí)張三在ATM查了一下賬號上余額(事務(wù)二),發(fā)現(xiàn)已經(jīng)是10100,于是回去準(zhǔn)備發(fā)貨,但是事務(wù)一在寫操作日志時(shí)超時(shí),這是事務(wù)回滾,存款交易被取消,錢退給了小王,這樣張三查到的賬號余額事實(shí)上是事務(wù)一還沒有提交的數(shù)據(jù),導(dǎo)致張三錯(cuò)誤的

12、認(rèn)為已經(jīng)收到交易款項(xiàng)。 一個(gè)事務(wù)讀到另外一個(gè)事務(wù)還沒有提交的數(shù)據(jù),我們稱之為臟讀。解決方法:把事務(wù)隔離級別調(diào)整到READ COMMITTED,即把右上圖中的SET TRAN ISOLATION LEVEL READ UNCOMMITTED更改成下圖中的SET TRAN ISOLATION LEVEL READ COMMITTED。這時(shí)我們重復(fù)上面的動(dòng)作會(huì)發(fā)現(xiàn)事務(wù)二會(huì)一直等到事務(wù)一執(zhí)行完畢再返回結(jié)果,因?yàn)榇藭r(shí)事務(wù)以已經(jīng)把自己的更改ROLLBACK了,所以事務(wù)二可以返回正確的結(jié)果。2. 張三先后兩次查詢某一賬號的余額,在兩次查詢期間,小王完成了銀行轉(zhuǎn)賬,導(dǎo)致兩次的查詢結(jié)果不同。一個(gè)事務(wù)先

13、后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,我們稱之為不可重復(fù)讀。解決方法:把事務(wù)隔離級別調(diào)整到REPEATABLE READ。在下圖中使用SET TRAN ISOLATION LEVEL REPEATABLE READ。這時(shí)我們重復(fù)上面的動(dòng)作會(huì)發(fā)現(xiàn)事務(wù)二會(huì)一直等到事務(wù)一執(zhí)行完畢再返回結(jié)果。3. 張三妻子先后兩次查詢張三招商銀行所有賬號的總余額,而在此期間張三在廣州招商銀行分行成功開設(shè)了一個(gè)賬號,并存入5000,導(dǎo)致張三妻子兩次查詢的總余額不同,在此期間張三原有兩個(gè)賬號的余額均未發(fā)生改變。  一個(gè)事務(wù)先后讀取一個(gè)范圍的記錄,但兩次讀取的紀(jì)錄數(shù)不同,我們稱之為幻象讀。解決方法:把事務(wù)隔離級別調(diào)整到

溫馨提示

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

最新文檔

評論

0/150

提交評論