Oracle數據庫的事務隔離級別
1、ANSI/ISO SQL92標準定義了一些數據庫操作的隔離級別:
l 未提交讀(read uncommitted)
l 提交讀(read committed)
l 重復讀(repeatable read)
l 序列化(serializable)
也就是隔離級別,0,1,2,3。ANSI/ISO SQL92標準有很詳細的說明
隔離級別0與事務無關,并且不加鎖,也就是說例如select * from t1,系統掃描過和讀取的每一行都不加鎖。
隔離級別1與事務無關,只對正在取數的行加鎖,取完數馬上開鎖,也就是說,begin tran 然后select * from t1即使沒有commit,鎖也會自動打開。
隔離級別2與事務有關,對掃描過的地方加鎖。例如,select * from t1,系統從第1行開始掃描,掃描到第5行的時候,1到5行都處于鎖定狀態,直到commit,這些鎖才解開。
隔離級別3與事務有關,對全表加鎖。
2、各種隔離級別出現的現象
通過一些現象,可以反映出隔離級別的效果。這些現象有:
更新丟失(lost update):當系統允許兩個事務同時更新同一數據是,發生更新丟失。
臟讀(dirty read):當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。
非重復讀(nonrepeatable read):同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重復讀。
幻讀(phantom read):同一查詢在同一事務中多次進行,由于其他提交事務所做的插入操作,每次返回不同的結果集,此時發生幻像讀。
3、Oracle數據庫的三種隔離級別
1). Read committed
該隔離級別不允許臟讀,也不允許重復讀(即再次讀取時可能會與原來的值不一樣),并且允許幻像讀(即再次讀取時新增的數據可以讀取到).
這里的重復讀和幻像讀均是oracle在其內部的一種實現機制,正常我們執行select后,再執行select不能算做重復讀或幻像讀,只是在oracle內部由于某種原因,在我們執行select 操作后,oracle在內部幫我們從數據塊中讀取數據時,讀取到一部分,發生了一些oracle認為有必要重新進行獲取的機制時,需要重頭開始讀取數據,這時的讀稱為重復讀!
2).serialable
該隔離級別要求同一會話session中的事務是序列化的,一般都不會用到這種隔離級別.
3).read Only
即事務是只讀的, 不允許update 和delete和insert操作.