Oracle數據庫的事務隔離級別

jopen 10年前發布 | 23K 次閱讀 Oracle 數據庫服務器

1ANSI/ISO SQL92標準定義了一些數據庫操作的隔離級別:

l 未提交讀(read uncommitted

l 提交讀(read committed

l 重復讀(repeatable read

l 序列化(serializable

      也就是隔離級別,0123ANSI/ISO SQL92標準有很詳細的說明

      隔離級別0與事務無關,并且不加鎖,也就是說例如select * from t1,系統掃描過和讀取的每一行都不加鎖。

      隔離級別1與事務無關,只對正在取數的行加鎖,取完數馬上開鎖,也就是說,begin tran 然后select * from t1即使沒有commit,鎖也會自動打開。

      隔離級別2與事務有關,對掃描過的地方加鎖。例如,select * from t1,系統從第1行開始掃描,掃描到第5行的時候,15行都處于鎖定狀態,直到commit,這些鎖才解開。

      隔離級別3與事務有關,對全表加鎖。

2、各種隔離級別出現的現象

通過一些現象,可以反映出隔離級別的效果。這些現象有:

更新丟失(lost update):當系統允許兩個事務同時更新同一數據是,發生更新丟失。

臟讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。

非重復讀(nonrepeatable read):同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重復讀。

幻讀(phantom read):同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻像讀。 

3Oracle數據庫的三種隔離級別

1). Read committed

       該隔離級別不允許臟讀,也不允許重復讀(即再次讀取時可能會與原來的值不一樣),并且允許幻像讀(即再次讀取時新增的數據可以讀取到).

      這里的重復讀和幻像讀均是oracle在其內部的一種實現機制,正常我們執行select,再執行select不能算做重復讀或幻像讀,只是在oracle內部由于某種原因,在我們執行select 操作后,oracle在內部幫我們從數據塊中讀取數據時,讀取到一部分,發生了一些oracle認為有必要重新進行獲取的機制時,需要重頭開始讀取數據,這時的讀稱為重復讀!

2).serialable

      該隔離級別要求同一會話session中的事務是序列化的,一般都不會用到這種隔離級別.

3).read Only

      即事務是只讀的, 不允許update deleteinsert操作.

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!