日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

多角度徹底理解數(shù)據(jù)庫(kù)事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀"

 Legend_Fish(^_^) 2010-04-21
多角度徹底理解數(shù)據(jù)庫(kù)事務(wù)中的"臟讀"."不可重復(fù)的讀"及"虛讀"
2008-02-10 19:04

以下幾個(gè)術(shù)語(yǔ)常見于數(shù)據(jù)庫(kù)文章、論文。操作系統(tǒng)分析中亦有涉及。
臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問(wèn)數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒(méi)有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問(wèn)這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒(méi)有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。

不可重復(fù)讀是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒(méi)有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問(wèn)該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。

幻覺讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如 第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒(méi)有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。

 

臟讀 dirty reads:當(dāng)事務(wù)讀取還未被提交的數(shù)據(jù)時(shí),就會(huì)發(fā)生這種事件。舉例來(lái)說(shuō):Transaction 1 修改了一行數(shù)據(jù),然后 Transaction 2 在 Transaction 1 還未提交修改操作之前讀取了被修改的行。如果 Transaction 1 回滾了修改操作,那么 Transaction 2 讀取的數(shù)據(jù)就可以看作是從未存在過(guò)的。     
不可重復(fù)的讀 non-repeatable reads:當(dāng)事務(wù)兩次讀取同一行數(shù)據(jù),但每次得到的數(shù)據(jù)都不一樣時(shí),就會(huì)發(fā)生這種事件。舉例來(lái)說(shuō):Transaction 1 讀取一行數(shù)據(jù),然后 Transaction 2 修改或刪除該行并提交修改操作。當(dāng) Transaction 1 試圖重新讀取該行時(shí),它就會(huì)得到不同的數(shù)據(jù)值(如果該行被更新)或發(fā)現(xiàn)該行不再存在(如果該行被刪除)。     
虛讀 phantom read:如果符合搜索條件的一行數(shù)據(jù)在后面的讀取操作中出現(xiàn),但該行數(shù)據(jù)卻不屬于最初的數(shù)據(jù),就會(huì)發(fā)生這種事件。舉例來(lái)說(shuō):Transaction 1 讀取滿足某種搜索條件的一些行,然后 Transaction 2 插入了符合 Transaction 1 的搜索條件的一個(gè)新行。如果 Transaction 1 重新執(zhí)行產(chǎn)生原來(lái)那些行的查詢,就會(huì)得到不同的行。

事務(wù)場(chǎng)景是這樣的:
對(duì)于同一個(gè)銀行帳戶A內(nèi)有200元,甲進(jìn)行提款操作100元,乙進(jìn)行轉(zhuǎn)帳操作100元到B帳戶。如果事務(wù)沒(méi)有進(jìn)行隔離可能會(huì)并發(fā)如下問(wèn)題:
1、第一類丟失更新:首先甲提款時(shí)帳戶內(nèi)有200元,同時(shí)乙轉(zhuǎn)帳也是200元,然后甲乙同時(shí)操作,甲操作成功取走100元,乙操作失敗回滾,帳戶內(nèi)最終為200元,這樣甲的操作被覆蓋掉了,銀行損失100元。
2、臟讀:甲取款100元未提交,乙進(jìn)行轉(zhuǎn)帳查到帳戶內(nèi)剩有100元,這是甲放棄操作回滾,乙正常操作提交,帳戶內(nèi)最終為0元,乙讀取了甲的臟數(shù)據(jù),客戶損失100元。
3、虛讀:和臟讀類似,是針對(duì)于插入操作過(guò)程中的讀取問(wèn)題,如丙存款100元未提交,這時(shí)銀行做報(bào)表進(jìn)行統(tǒng)計(jì)查詢帳戶為200元,然后丙提交了,這時(shí)銀行再統(tǒng)計(jì)發(fā)現(xiàn)帳戶為300元了,無(wú)法判斷到底以哪個(gè)為準(zhǔn)?
大家好像覺得統(tǒng)計(jì)這個(gè)東西肯定是時(shí)時(shí)更新的,這種情況很正常;但是如果統(tǒng)計(jì)是在一個(gè)事務(wù)中的時(shí)候就不正常了,比如我們的一個(gè)統(tǒng)計(jì)應(yīng)用需要將統(tǒng)計(jì)結(jié)果分別輸出到電腦屏幕和遠(yuǎn)程網(wǎng)絡(luò)某臺(tái)計(jì)算機(jī)的磁盤文件中,為了
提高性能和用戶響應(yīng)我們分成2個(gè)線程,這時(shí)先完成的和后完成的統(tǒng)計(jì)數(shù)據(jù)就可能不一致,我們就不知道以哪個(gè)為準(zhǔn)了。
4、不可重復(fù)讀:甲乙同時(shí)開始都查到帳戶內(nèi)為200元,甲先開始取款100元提交,這時(shí)乙在準(zhǔn)備最后更新的時(shí)候又進(jìn)行了一次查詢,發(fā)現(xiàn)結(jié)果是100元,這時(shí)乙就會(huì)很困惑,不知道該將帳戶改為100還是0。
和臟讀的區(qū)別是,臟讀是讀取前一事務(wù)未提交的臟數(shù)據(jù),不可重復(fù)讀是重新讀取了前一事務(wù)已提交的數(shù)據(jù)。
5、第二類丟失更新:是不可重復(fù)讀的一種特例,如上,乙不做第二次查詢而是直接操作完成,帳戶內(nèi)最終為100元,甲的操作被覆蓋掉了,銀行損失100元。感覺和第一類丟失更新類似。


在多個(gè)事務(wù)并發(fā)做數(shù)據(jù)庫(kù)操作的時(shí)候,如果沒(méi)有有效的避免機(jī)制,就會(huì)出現(xiàn)種種問(wèn)題。大體上有三種問(wèn)題,歸結(jié)如下:
1、丟失更新
如果兩個(gè)事務(wù)都要更新數(shù)據(jù)庫(kù)一個(gè)字段X,x=100
事務(wù)A             事務(wù)B
讀取X=100    
                  讀取X=100
寫入x=X+100
                  寫入x=X+200
事務(wù)結(jié)束x=200
                  事務(wù)結(jié)束x=300
最后x==300
這種情況事務(wù)A的更新就被覆蓋掉了、丟失了。
丟失更新說(shuō)明事務(wù)進(jìn)行數(shù)據(jù)庫(kù)寫操作的時(shí)候可能會(huì)出現(xiàn)的問(wèn)題。
2、不可重復(fù)讀
一個(gè)事務(wù)在自己沒(méi)有更新數(shù)據(jù)庫(kù)數(shù)據(jù)的情況,同一個(gè)查詢操作執(zhí)行兩次或多次的結(jié)果應(yīng)該是一致的;如果不一致,就說(shuō)明為不可重復(fù)讀。
還是用上面的例子
事務(wù)A             事務(wù)B
讀取X=100    
                  讀取X=100
讀取X=100    
                  寫入x=X+100
讀取X=200    
事務(wù)結(jié)束x=200
                  事務(wù)結(jié)束x=200
這種情況事務(wù)A多次讀取x的結(jié)果出現(xiàn)了不一致,即為不可重復(fù)讀。
再有一情況就是幻影
事務(wù)A讀的時(shí)候讀出了15條記錄,事務(wù)B在事務(wù)A執(zhí)行的過(guò)程中刪除(增加)了1條,事務(wù)A再讀的時(shí)候就變成了14(16)條,這種情況就叫做幻影讀。
不可重復(fù)讀說(shuō)明了做數(shù)據(jù)庫(kù)讀操作的時(shí)候可能會(huì)出現(xiàn)的問(wèn)題。
3、臟讀(未提交讀)
防止一個(gè)事務(wù)讀到另一個(gè)事務(wù)還沒(méi)有提交的記錄。
如:
事務(wù)A             事務(wù)B
                  讀取X=100
                  寫入x=X+100
讀取X=200    
                  事務(wù)回滾x=100
讀取X=100    
事務(wù)結(jié)束x=100

x鎖 排他鎖 被加鎖的對(duì)象只能被持有鎖的事務(wù)讀取和修改,其他事務(wù)無(wú)法在該對(duì)象上加其他鎖,也不能讀取和修改該對(duì)象
s鎖 共享鎖 被加鎖的對(duì)象可以被持鎖事務(wù)讀取,但是不能被修改,其他事務(wù)也可以在上面再加s鎖。
封鎖協(xié)議:
一級(jí)封鎖協(xié)議:
在事務(wù)修改數(shù)據(jù)的時(shí)候加x鎖,直到事務(wù)結(jié)束(提交或者回滾)釋放x鎖。一級(jí)封鎖協(xié)議可以有效的防止丟失更新,但是不能防止臟讀不可重復(fù)讀的出現(xiàn)。
二級(jí)封鎖協(xié)議:
在一級(jí)封鎖的基礎(chǔ)上事務(wù)讀數(shù)據(jù)的時(shí)候加s鎖,讀取之后釋放。二級(jí)封鎖協(xié)議可以防止丟失更新,臟讀。不能防止不可重復(fù)讀。
三級(jí)封鎖協(xié)議:
在一級(jí)封鎖的基礎(chǔ)上事務(wù)讀數(shù)據(jù)的時(shí)候加s鎖,直到事務(wù)結(jié)束釋放。二級(jí)封鎖協(xié)議可以防止丟失更新,臟讀,不可重復(fù)讀。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多