資源描述:
《事務(wù)隔離級(jí)別》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、事務(wù)隔離級(jí)別 在JDBC操作中,為了有效保證并發(fā)讀取數(shù)據(jù)的正確性,提出的事務(wù)隔離級(jí)別的概念。 問(wèn)題的提出:數(shù)據(jù)庫(kù)是要被廣大客戶所共享訪問(wèn)的,那么在數(shù)據(jù)庫(kù)操作過(guò)程中很可能出現(xiàn)以下幾種不確定情況?! 窀聛G失(Lostupdate):兩個(gè)事務(wù)都同時(shí)更新一行數(shù)據(jù),但是第二個(gè)事務(wù)卻中途失敗退出,導(dǎo)致對(duì)數(shù)據(jù)的兩個(gè)修改都失效了。這是因?yàn)橄到y(tǒng)沒(méi)有執(zhí)行任何的鎖操作,因此并發(fā)事務(wù)并沒(méi)有被隔離開(kāi)來(lái)?! 衽K讀(DirtyReads):一個(gè)事務(wù)開(kāi)始讀取了某行數(shù)據(jù),但是另外一個(gè)事務(wù)已經(jīng)更新了此數(shù)據(jù)但沒(méi)有能夠及時(shí)提交。這是
2、相當(dāng)危險(xiǎn)的,因?yàn)楹芸赡芩械牟僮鞫急换貪L?! 癫豢芍貜?fù)讀(Non-repeatableReads):一個(gè)事務(wù)對(duì)同一行數(shù)據(jù)重復(fù)讀取兩次,但是卻得到了不同的結(jié)果。例如,在兩次讀取的中途,有另外一個(gè)事務(wù)對(duì)該行數(shù)據(jù)進(jìn)行了修改,并提交?! 駜纱胃聠?wèn)題(Secondlostupdatesproblem):無(wú)法重復(fù)讀取的特例。有兩個(gè)并發(fā)事務(wù)同時(shí)讀取同一行數(shù)據(jù),然后其中一個(gè)對(duì)它進(jìn)行修改提交,而另一個(gè)也進(jìn)行了修改提交。這就會(huì)造成第一次寫(xiě)操作失效?! 窕米x(PhantomReads):事務(wù)在操作過(guò)程中進(jìn)行兩次查詢,
3、第二次查詢的結(jié)果包含了第一次查詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語(yǔ)句相同)。這是因?yàn)樵趦纱尾樵冞^(guò)程中有另外一個(gè)事務(wù)插入數(shù)據(jù)造成的?! 〗鉀Q方案:為了避免上面出現(xiàn)的幾種情況,在標(biāo)準(zhǔn)SQL規(guī)范中,定義了4個(gè)事務(wù)隔離級(jí)別,不同的隔離級(jí)別對(duì)事務(wù)的處理不同?! 裎词跈?quán)讀取,也稱為讀未提交(ReadUncommitted):允許臟讀取,但不允許更新丟失。如果一個(gè)事務(wù)已經(jīng)開(kāi)始寫(xiě)數(shù)據(jù),則另外一個(gè)數(shù)據(jù)則不允許同時(shí)進(jìn)行寫(xiě)操作,但允許其他事務(wù)讀此行數(shù)據(jù)。該隔離級(jí)別可以通過(guò)“排他寫(xiě)鎖”實(shí)現(xiàn)?! 袷跈?quán)讀取,也稱為
4、讀提交(ReadCommitted):允許不可重復(fù)讀取,但不允許臟讀取。這可以通過(guò)“瞬間共享讀鎖”和“排他寫(xiě)鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問(wèn)該行數(shù)據(jù),但是未提交的寫(xiě)事務(wù)將會(huì)禁止其他事務(wù)訪問(wèn)該行。 ●可重復(fù)讀?。≧epeatableRead):禁止不可重復(fù)讀取和臟讀取,但是有時(shí)可能出現(xiàn)幻影數(shù)據(jù)。這可以通過(guò)“共享讀鎖”和“排他寫(xiě)鎖”實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫(xiě)事務(wù)(但允許讀事務(wù)),寫(xiě)事務(wù)則禁止任何其他事務(wù)?! 裥蛄谢⊿erializable):提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事
5、務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過(guò)“行級(jí)鎖”是無(wú)法實(shí)現(xiàn)事務(wù)序列化的,必須通過(guò)其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問(wèn)到?! 「綦x級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為ReadCommitted,它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、虛讀和第二類丟失更新這些并發(fā)問(wèn)題,在可能出現(xiàn)這類問(wèn)題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂(lè)觀鎖來(lái)控制。關(guān)于可重復(fù)讀:?jiǎn)栴}:“可
6、重復(fù)讀”一般被解釋成“是個(gè)事務(wù)多次讀取數(shù)據(jù),讀的結(jié)果一致,不會(huì)讀到別的事務(wù)提交的數(shù)據(jù)”。。。請(qǐng)問(wèn):這個(gè)解釋真的正確嗎?1是另一個(gè)事務(wù)提交了,這個(gè)事務(wù)讀不到,還是說(shuō):2在這個(gè)事務(wù)沒(méi)有還沒(méi)有commit之前,另外一個(gè)事務(wù)不能進(jìn)行update,insert,delete操作??答案是1還是2?或者都不是,請(qǐng)高手賜教了。。答案是2可重復(fù)讀隔離級(jí)別是最嚴(yán)格的隔離級(jí)別。在該隔離級(jí)別下,一個(gè)事務(wù)的影響完全與其他并發(fā)事務(wù)隔離,臟讀、不可重復(fù)的讀、幻像讀現(xiàn)象都不會(huì)發(fā)生。當(dāng)使用可重復(fù)讀隔離級(jí)別時(shí),在事務(wù)執(zhí)行期間會(huì)鎖定該事務(wù)
7、以任何方式引用的所有行。因此,如果在同一個(gè)事務(wù)中發(fā)出同一個(gè)SELECT語(yǔ)句兩次或更多次,那么產(chǎn)生的結(jié)果數(shù)據(jù)集總是相同的。因此,使用可重復(fù)讀隔離級(jí)別的事務(wù)可以多次檢索同一行集,并對(duì)它們執(zhí)行任意操作,直到提交或回滾操作終止該事務(wù)。但是,在事務(wù)存在期間,不允許其他事務(wù)執(zhí)行會(huì)影響這個(gè)事務(wù)正在訪問(wèn)的任何行的插入、更新或刪除操作。為了確保這種行為不會(huì)發(fā)生,鎖定該事務(wù)所引用的每一行--而不是僅鎖定被實(shí)際檢索或修改的那些行。因此,如果一個(gè)事務(wù)掃描了1000行,但只檢索10行,那么它所掃描的1000行(而不僅是被檢索的1
8、0行)都會(huì)被鎖定。隔離級(jí)別中的重復(fù)讀是是指在第一次讀出數(shù)據(jù)后數(shù)據(jù)被修改了但第二次去讀為保證數(shù)據(jù)一致,還是與第一次讀的一樣,這是比較高的隔離級(jí)別。還有一個(gè)比它高的幻影讀是即使你添加列等操作都讀不出來(lái)[轉(zhuǎn)載]微軟SQLServer事務(wù)隔離級(jí)別實(shí)例簡(jiǎn)介作者:EdisonZhu??來(lái)源:博客園??發(fā)布時(shí)間:2009-11-1223:56??閱讀:173次??原文鏈接??[收藏]??源文:?http://untitled.spaces.live.co