Oracle資料庫事務隔離級別概述

路途中的人2012發表於2016-01-24
整理自Oracle 11g R2 官方文件 《concepts》
001 概述
    Oracle資料庫提供如下事務隔離級別:
    ·已提交讀隔離級別
    ·可序列化隔離級別
    ·只讀隔離級別

002 讀提交隔離級別
2-1 概述
    在(預設的)已提交讀隔離級別中,事務中執行的每個查詢,僅看到在查詢 開始之前提交的資料——而不是事務開始之前提交的資料。這一隔離級別適合於幾乎不可能發生事務衝突的資料庫環境。
    已提交讀事務中的查詢可以避免讀取在查詢過程中所提交的資料。例如,如 果一個查詢正掃描到一個百萬行表的中間,而另一個不同的事務對第950000行提交了一個更新,但當查詢讀到第 950000行時,它並不能看見這個變化。但是,因為資料庫不會阻止其它事務修改一個查詢所讀取的數據,其他事務可能會在查詢執行期間更改資料。因此,兩次執行相同查詢的事務可能會遇到模糊讀取和幻像讀取現象。
2-2 在已提交讀隔離級別中的讀取一致性
    為每個查詢提供一個一致的結果集,其目的是為了保證資料一致性,而無需 使用者採取任何行動。對於隱含的查詢(如在一個UPDATE語句中的WHERE子句), 也同樣可以保證其一致的結果集。但是,在隱式查詢中的每個語句不會看到 DML 語句本身所做的更改,只能看到更改之前所存在的資料。
    如果 SELECT 列表中包含一個PL/SQL 函式,則資料庫在該PL/SQL 函式代碼內執行的SQL所在語句級別(而不是在父SQL 級別)上,應用語句級別讀取一致性。例如,一個函式可能會訪問某個表,其資料被另一個使用者更改並提交。在 SELECT語句中的每次函式執行,都會建立一個新的讀一致性快照。
2-3 在讀提交事務中的寫入衝突
    在一個讀已提交事務中,當事務嘗試更改由另一個未提交併發事務(有時稱 為阻塞事務)所更新的行時,會發生寫入衝突。讀提交事務將等待阻塞事務結束並釋放其行鎖。有兩個選項如下所示:
    ·如果阻塞事務回滾,正在等待的事務將繼續並更改之前被鎖定的行,就像另一個事務從未存在一樣。
    ·如果阻塞事務提交併釋放了鎖,則正在等待的事務將對這個剛被更新的行繼續其預定更新。

003 可序列化隔離級別
    在可序列化隔離級別,事務只看到自事務開始以來(而不是自查詢以來)該 事務本身所提交的更改。可序列化事務的執行環境,使其看起來好像沒有其他使用者在修改資料庫中的資料。
    可序列化隔離適合如下環境:
     ·大型資料庫中只更新少數幾行的短事務
     ·兩個併發事務將修改相同的行的可能性相對較低
     ·較長時間執行的事務主要為只讀事務
    
    在可序列化隔離級別,在語句級別所獲得的讀取一致性通常延伸到整個事務 範圍。當重新讀取在同一事務中之前讀取的任何行時,保證結果相同。可以保證任何查詢在該事務的持續期間返回相同的結果,因此其他事務所做的更改是不可見的,無論該查詢已執行了多長時間。可序列化事務不會遇到髒讀、模糊讀取、或幻讀。
    Oracle 資料庫允許可序列化事務修改行,只要當可序列化事務開始時,由其它事務對行所做更改提交。當一個序列化事務試圖更新或刪除某資料,而該資料在序列化事務開始後被一個不同的事務更改並提交,則資料庫將生成一個錯誤:
ORA-08177: Cannot serialize access for this transaction
    當可序列化事務失敗,產生 ORA-08177 錯誤時,應用程式可以採取行動, 包括以下幾種:
     ·將所執行的工作提交到該點
        ·也許要先回滾到事務中之前建立的某儲存點,然後執行一些其他額外的( 不同)語句
     ·回滾整個事務


004 只讀隔離級別
    只讀隔離級別類似於可序列化隔離級別,但只讀事務不允許資料在事務中被 修改,除非該使用者是 SYS。因此,只讀事務不會受到 ORA-08177 錯誤的影響。只讀事務可用於生成報表,其內容必須與事務開始時保持一致。
    Oracle 資料庫透過按需從撤銷段重建資料,來實現讀取一致性。因為撤消段是以一個迴圈方式使用的,資料庫可以覆蓋撤銷資料。長時間執行的報表可能有一定的風險,讀取一致性所需要的撤銷資料,可能已被一個不同的事務重用,並丟擲快照太舊(snapshot too old錯誤。設定一個撤消保留期,即在舊資料被覆蓋之前,資料庫嘗試保留撤消資料的最短時間,以期避免這一問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-1981468/,如需轉載,請註明出處,否則將追究法律責任。

相關文章