新聞中心
前幾天一個金融行業(yè)的朋友和我討論數(shù)據(jù)庫選型的事情,他們在選擇分布式數(shù)據(jù)庫的時候發(fā)現(xiàn)這些數(shù)據(jù)庫支持的事務隔離級別與Oracle有較大差異,有位領導認為對事務隔離級別的支持能力說明了數(shù)據(jù)庫在并發(fā)處理方面的能力,因此要在選型中占有比較高的分值,甚至要在較高事務隔離級別下測試數(shù)據(jù)庫的并發(fā)性能。他對此持不同的看法。

在陽泉等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站制作、做網(wǎng)站、外貿營銷網(wǎng)站建設 網(wǎng)站設計制作定制網(wǎng)站,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,高端網(wǎng)站設計,成都營銷網(wǎng)站建設,成都外貿網(wǎng)站建設公司,陽泉網(wǎng)站建設費用合理。
數(shù)據(jù)庫事務隔離級別的概念最早是在1981年由IBM的Jim Gray等人提出的,他們在論文《The Notions of Consistency and Predicate Locks in a Database System》中定義了四種隔離級別,分別是:
- 讀未提交(Read uncommitted):最低的隔離級別,允許一個事務讀取另一個未提交事務的數(shù)據(jù),可能導致臟讀、不可重復讀、幻讀等問題。
- 讀提交(Read committed):目前被應用最為廣泛的使用的事務隔離級別,只允許一個事務讀取另一個已提交事務的數(shù)據(jù),可以避免臟讀,但不能避免不可重復讀、幻讀等問題。
- 可重復讀(Repeatable read):較高的隔離級別,保證一個事務在執(zhí)行過程中對同一數(shù)據(jù)的多次讀取結果都是一致的,可以避免臟讀、不可重復讀,但不一定能避免幻讀等問題。
- 串行化(Serializable):最高的隔離級別,要求事務串行執(zhí)行,不允許并發(fā)訪問和修改同一數(shù)據(jù),可以避免臟讀、不可重復讀、幻讀等所有問題,但性能最差。
數(shù)據(jù)庫的多種事務隔離級別是想為應用開發(fā)者提供不同的并發(fā)控制,從而適應各種不同的應用應用場景。這在T/S架構流行的80/90年代應用廣泛。那時候所有的計算都只能在主機或者小型機上完成,因此數(shù)據(jù)庫提供的這個功能可以大大簡化應用開發(fā)。C/S架構出現(xiàn)后,特別是后來的三層架構大行其道的時代之后,Read Committed變成了最為常用的事務隔離級別,其他事務隔離級別大多數(shù)都基本上不用了。比Read Committed更高的事務隔離級別被前置到應用前端或者中間層來實現(xiàn)了。
更高的事務隔離級別的最著名的例子就是分頁查詢,在RC隔離級別下,哪怕是在一個事務中,我們在前端分頁查詢同一個數(shù)據(jù)時,都會看到“臟數(shù)據(jù)”,因為這些數(shù)據(jù)在我們讀的時候也會有人同時在修改和寫入新的滿足條件的數(shù)據(jù)。對于這種方式的處理方法一般來說就是容忍“臟數(shù)據(jù)”,互聯(lián)網(wǎng)應用一般都是這樣處理的。而對于數(shù)據(jù)一致性要求很高的財務系統(tǒng),則一般采用在中間層緩存數(shù)據(jù)或者使用全局臨時表緩存數(shù)據(jù)的方式來確保數(shù)據(jù)的一致性。
現(xiàn)在的應用較少的通過事務隔離級別來處理這種高一致性要求的數(shù)據(jù)的主要原因還是因為技術發(fā)展了,多層架構讓中間層有了更為強大的可擴展的處理能力,而數(shù)據(jù)庫本身也因為硬件的發(fā)展能夠承受大量的臨時表存儲數(shù)據(jù)的需求。這些應用層實現(xiàn)的更高事務隔離級別的應用需求往往比通過數(shù)據(jù)庫實現(xiàn)有更高的靈活性,因此比RC更高的事務隔離級別實際上在我們的大多數(shù)應用中已經(jīng)早就沒有人使用了。
可能有朋友要問,為什么MySQL的默認事務隔離級別不是RC而是RR呢?這和MySQL數(shù)據(jù)庫的歷史有關,MySQL數(shù)據(jù)庫因為早期的BINLOG復制不支持RAW格式的問題而必須選擇RR,如果使用RC無法確保復制數(shù)據(jù)的一致性。但是用了RR這種事務隔離級別,又會引起數(shù)據(jù)庫的并發(fā)性能受到影響,因此MySQL引入了GAP LOCK這種特殊的鎖機制,來降低RR對數(shù)據(jù)庫并發(fā)的性能影響。哪怕是引入了GAP LOCK,在RR隔離級別下,對于SELECT … FOR UPDATE的操作,RR隔離級別也會比RC有更多的鎖阻塞,因此我們建議MySQL用戶如果BINLOG復制使用能夠RAW的情況下,還是把默認的事務隔離級別設置為RC。
回到文章頭上的那個金融交易系統(tǒng)的例子,這個例子是十分典型的RC事務隔離級別就是最佳隔離級別的例子,在此種應用場景下,還把事務隔離級別看作是數(shù)據(jù)庫選型的重要因素,就有點不太合適了。
分布式數(shù)據(jù)庫最早的初衷就是提高并發(fā)交易的能力,因此它們在較高事務隔離級別方面天然就處于劣勢的,用這種因素去選型,肯定就與選型的初衷背道而馳了。實際上與前面所說的一樣,目前我們的應用開發(fā)大多數(shù)都基于RC事務隔離級別。更高的事務隔離級別的應用需求大多數(shù)都在應用中去處理了,或者說哪怕要用數(shù)據(jù)庫來實現(xiàn),這種應用場景應該也不會是有很高并發(fā)的。因此在較高事務隔離級別下測試并發(fā)性能對于大多數(shù)用戶來說確實是沒有太大必要了。
本文題目:聊聊數(shù)據(jù)庫的事務隔離級別
本文網(wǎng)址:http://www.5511xx.com/article/dpisdei.html


咨詢
建站咨詢
