serializable
一般認為這是最受限的隔離級別,但是它也提供了最高程度的隔離性。serializable事務在乙個環境中操作時,就好像沒有別的使用者在修改資料庫中的資料一樣。我們讀取的所有行在重新讀取時都肯定完全一樣,所執行的查詢在整個事務期間也總能返回相同的結果。serializable這個隔離級別可以確保這兩個查詢總會返回相同的結果。其他事務的***對查詢是不可見的,而不論這個查詢執行了多長時間。
oracle中是這樣實現serializable事務的:原本通常在語句級得到的讀一致性現在可以擴充套件到事務。結果並非相對於語句開始的那個時間點一致,而是在事務開始的那一刻就固定了。換句話說,oracle使用undo段按事務開始時資料的原樣來重建資料,而不是按語句開始時的樣子重建。
oracle採用了一種樂觀的方法來實現序列化,它認為你的事務想要更新的資料不會被其他事務所更新,而且把寶押在這上面。一般確實是這樣的,所以說通常這個寶是押對了,特別是在事務執行得很快的oltp型系統中。儘管在其他系統中這個隔離級別通常會降低併發性,但是在oracle中,倘若你的事務在執行期間沒有別人更新你的資料,則能提供同等程度的併發性,就好像沒有serializable事務一樣。另一方面,這也是有缺點的,如果寶押錯了,你就會得到ora-08177錯誤。不過,可以再想想看,冒這個險還是值得的。如果你在使用乙個serializable事務,就不要指望它與其他事務一同更新同樣的資訊。所以,如果使用serializable隔離級別,只要保證以下幾點就能很在成效。
.一般沒有其他人修改相同的資料
.需要事務級讀一致性
.事務都很短
在許多其他的實現中,這種隔離性都是利用共享讀鎖達到的,相應地會帶來死鎖和阻塞。而在oracle中 ,沒有任何阻塞,但是如果其他會話修改了我們也想修改的資料,則會得到ora-08177錯誤。
如果安全級別設定為serializable,事務開始之後,不會看到資料庫中作出任何修改,直到提交事務為止。
serializable並不意味著使用者執行的所有事務都表現得好像是以一種序列方式乙個接乙個地執行。serializable不代表事務有某種序列順序並且總能得到相同的結果。
Oracle 事務隔離級別
先看一張concepts中關於事務隔離級別的一張 從上圖可以看到 通常事務的隔離級別定義為以下4種 基於3種在併發事務中需要避免的現象來劃分的 1.read uncommitted 從字面意義可以看出,讀取那些未提交的資料。事務1在事務進行過程中,會讀到事務2修改了但是沒有提交的資料,所以產生了 髒...
Oracle事務隔離級別
髒讀 dirty read 當乙個事務讀取另乙個事務尚未提交的修改時,產生髒讀。不可重複讀 nonrepeatable read 同一查詢在同一事務中多次進行,在此期間,由於其他事務提交了對資料的修改或刪除,每次返回不同的結果。幻讀 phantom read 同一查詢在同一事務中多次進行,由於其他提...
Oracle事務隔離級別
一 事務四個性質 acid 1 原子性 atomaicity 乙個事務是乙個不可分割的單元。2 一致性 consistency 事務的原子性保證的事務的一致性。3 隔離性 isolation 三種現象 1 髒讀 即讀出其它事務未提交的資料。2 不可重複讀 乙個事務,兩個不同時間,讀取的資料不同,被他...