資料庫事務的隔離等級
資料庫軟體需要解決的主要問題為“資料一致性”和“訪問並發性”之間的矛盾,在理論上人們總結出保證資料一致性需要解決的幾種不確定性情況,並以此為基礎提出了資料庫事務的幾種隔離等級。
首先,來看一下,解決資料一致性的過程中,方法會發生的幾種不確定情況。
髒讀:
髒讀又稱無效資料的讀出,是指在資料庫訪問的過程中,事務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 三種隔離等級。不同的資料庫軟體對隔離等級的實現方式是不同的,實現的程度也是不同的,需要具體情況具體分析。