東坡下載:內(nèi)容最豐富最安全的下載站!

首頁編程開發(fā)VC(VC++) → 標(biāo)準(zhǔn)SQL規(guī)范中定義的四個事務(wù)隔離級別

標(biāo)準(zhǔn)SQL規(guī)范中定義的四個事務(wù)隔離級別

相關(guān)文章發(fā)表評論 來源:本站時間:2010/10/14 9:33:50字體大。A-A+

更多

作者:東坡下載點擊:238次評論:1次標(biāo)簽:

      在標(biāo)準(zhǔn)sql規(guī)范中,定義了4個事務(wù)隔離級別,不同的隔離級別對事務(wù)的處理不同:
◆未授權(quán)讀。╮ead uncommitted):允許臟讀取,但不允許更新丟失。如果一個事務(wù)已經(jīng)開始寫數(shù)據(jù),則另外一個數(shù)據(jù)則不允許同時進(jìn)行寫操作,但允許其他事務(wù)讀此行數(shù)據(jù)。該隔離級別可以通過"排他寫鎖"實現(xiàn)。
◆授權(quán)讀。╮ead committed):允許不可重復(fù)讀取,但不允許臟讀取。這可以通過"瞬間共享讀鎖"和"排他寫鎖"實現(xiàn)。讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務(wù)將會禁止其他事務(wù)訪問該行。
◆可重復(fù)讀。╮epeatable read):禁止不可重復(fù)讀取和臟讀取,但是有時可能出現(xiàn)幻影數(shù)據(jù)。這可以通過"共享讀鎖"和"排他寫鎖"實現(xiàn)。讀取數(shù)據(jù)的事務(wù)將會禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其他事務(wù)。
◆序列化(serializable):提供嚴(yán)格的事務(wù)隔離。它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個接著一個地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過"行級鎖"是無法實現(xiàn)事務(wù)序列化的,必須通過其他機(jī)制保證新插入的數(shù)據(jù)不會被剛執(zhí)行查詢操作的事務(wù)訪問到。
      隔離級別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大。對于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級別設(shè)為read committed,它能夠避免臟讀取,而且具有較好的并發(fā)性能。盡管它會導(dǎo)致不可重復(fù)讀、虛讀和第二類丟失更新這些并發(fā)問題,在可能出現(xiàn)這類問題的個別場合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來控制。
      通過前面的介紹已經(jīng)知道,通過選用不同的隔離等級就可以在不同程度上避免前面所提及的在事務(wù)處理中所面臨的各種問題。所以,數(shù)據(jù)庫隔離級別的選取就顯得尤為重要,在選取數(shù)據(jù)庫的隔離級別時,應(yīng)該注意以下幾個處理的原則:
首先,必須排除"未授權(quán)讀取",因為在多個事務(wù)之間使用它將會是非常危險的。事務(wù)的回滾操作或失敗將會影響到其他并發(fā)事務(wù)。第一個事務(wù)的回滾將會完全將其他事務(wù)的操作清除,甚至使數(shù)據(jù)庫處在一個不一致的狀態(tài)。很可能一個已回滾為結(jié)束的事務(wù)對數(shù)據(jù)的修改最后卻修改提交了,因為"未授權(quán)讀取"允許其他事務(wù)讀取數(shù)據(jù),最后整個錯誤狀態(tài)在其他事務(wù)之間傳播開來。
其次,絕大部分應(yīng)用都無須使用"序列化"隔離(一般來說,讀取幻影數(shù)據(jù)并不是一個問題),此隔離級別也難以測量。目前使用序列化隔離的應(yīng)用中,一般都使用悲觀鎖,這樣強(qiáng)行使所有事務(wù)都序列化執(zhí)行。
剩下的也就是在"授權(quán)讀取"和"可重復(fù)讀取"之間選擇了。我們先考慮可重復(fù)讀取。如果所有的數(shù)據(jù)訪問都是在統(tǒng)一的原子數(shù)據(jù)庫事務(wù)中,此隔離級別將消除一個事務(wù)在另外一個并發(fā)事務(wù)過程中覆蓋數(shù)據(jù)的可能性(第二個事務(wù)更新丟失問題)。這是一個非常重要的問題,但是使用可重復(fù)讀取并不是解決問題的唯一途徑。
     假設(shè)使用了"版本數(shù)據(jù)",hibernate會自動使用版本數(shù)據(jù)。hibernate的一級session緩存和版本數(shù)據(jù)已經(jīng)為你提供了"可重復(fù)讀取隔離"絕大部分的特性。特別是,版本數(shù)據(jù)可以防止二次更新丟失的問題,一級session緩存可以保證持久載入數(shù)據(jù)的狀態(tài)與其他事務(wù)對數(shù)據(jù)的修改隔離開來,因此如果使用對所有的數(shù)據(jù)庫事務(wù)采用授權(quán)讀取隔離和版本數(shù)據(jù)是行得通的。
     "可重復(fù)讀取"為數(shù)據(jù)庫查詢提供了更好的效率(僅對那些長時間的數(shù)據(jù)庫事務(wù)),但是由于幻影讀取依然存在,因此沒必要使用它(對于web應(yīng)用來說,一般也很少在一個數(shù)據(jù)庫事務(wù)中對同一個表查詢兩次)。
也可以同時考慮選擇使用hibernate的二級緩存,它可以如同底層的數(shù)據(jù)庫事務(wù)一樣提供相同的事務(wù)隔離,但是它可能弱化隔離。假如在二級緩存大量使用緩存并發(fā)策略,它并不提供重復(fù)讀取語義(例如,后面章節(jié)中將要討論的讀寫,特別是非嚴(yán)格讀寫),很容易可以選擇默認(rèn)的隔離級別:因為無論如何都無法實現(xiàn)"可重復(fù)讀取",因此就更沒有必要拖慢數(shù)據(jù)庫了。另一方面,可能對關(guān)鍵類不采用二級緩存,或者采用一個完全的事務(wù)緩存,提供"可重復(fù)讀取隔離"。那么在業(yè)務(wù)中需要使用到"可重復(fù)讀取"嗎?如果你喜歡,當(dāng)然可以那樣做,但更多的時候并沒有必要花費(fèi)這個代價。

相關(guān)評論

閱讀本文后您有什么感想? 已有 人給出評價!

  • 2791 喜歡喜歡
  • 2101 頂
  • 800 難過難過
  • 1219 囧
  • 4049 圍觀圍觀
  • 5602 無聊無聊
熱門評論
最新評論
發(fā)表評論 查看所有評論(1)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)