資料庫事務的隔離等級

來源:互聯網
上載者:User

資料庫事務的隔離等級

資料庫軟體需要解決的主要問題為“資料一致性”和“訪問並發性”之間的矛盾,在理論上人們總結出保證資料一致性需要解決的幾種不確定性情況,並以此為基礎提出了資料庫事務的幾種隔離等級。

首先,來看一下,解決資料一致性的過程中,方法會發生的幾種不確定情況。

髒讀:

髒讀又稱無效資料的讀出,是指在資料庫訪問的過程中,事務T1對某一值進行了修改,在沒有提交之前,事務T2可以讀取到事務T1的修改,由於T1事務還沒有提交,因此T2讀到的T1交易資料時無效的,即該資料為髒資料。

不可重複讀取:

在一個事務內,多次讀同一個資料。在這個事務還沒有結束時,另一個事務也訪問該同一資料。那麼,在第一個事務的兩次讀資料之間。由於第二個事務的修改,那麼第一個事務讀到的資料可能不一樣,這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為不可重複讀取,即原始讀取不可重複

通過將事務的隔離等級設定為repeatable read可以防止不可重複讀取,在oracle中,我們可以通過select for update達到同樣的效果。

幻讀:

情況1:

第一個事務對一個表中的資料進行了修改,比如這種修改涉及到表中的“全部資料行”。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入“一行新資料”。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象發生了幻覺一樣.

 情況2:

事務T1查詢表t1(5條)和t2(10條)中的記錄總數之和(應為15),在事務T1查詢完表t1之後並在查詢t2 之前,事務T2向t1和t2中分別插入兩條記錄,並提交,隨後事務T1查詢t2中的記錄總數,並得出結果t1=5 t2=12,總記錄數17,實際的記錄總數應為15或者19,不存在17,就像出現了幻覺

解決幻讀需要將事務的隔離等級設定為serialization,即序列化


為了避免出現上面的幾種情況,在標準SQL規範中,定義了4個交易隔離等級。

Read Uncommited

為了避免允許髒讀取,但不允許更新丟失。如果一個事務已經開始寫資料,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行資料

Read Commited

允許不可重複讀取,但不允許髒讀取。

repeatable read禁止不可重複讀取和髒讀取,但是有時可能出現幻影資料Serializable提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接著一個地執行,但不能並發執行。

√: 可能出現    ×: 不會出現

髒讀 不可重複讀取 幻讀
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

 

在oracle資料庫中,存在READ COMMITED(預設),Serializable,readonly 三種隔離等級。不同的資料庫軟體對隔離等級的實現方式是不同的,實現的程度也是不同的,需要具體情況具體分析。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.