一、事務四個性質(acid)。
1、原子性(atomaicity)
乙個事務是乙個不可分割的單元。
2、一致性(consistency)
事務的原子性保證的事務的一致性。
3、隔離性(isolation)
三種現象:
1)、髒讀
即讀出其它事務未提交的資料。
2)、不可重複讀
乙個事務,兩個不同時間,讀取的資料不同,被他人更新了。
3)、幻像讀
乙個事務,t1有乙個查詢結果集,t2再查詢,資料變多了,他人有插入。
根據以上三種現象,ansi/iso分為四種隔離級別:
隔離級別 髒讀
不可重複讀
幻像讀read uncommitted 允許
允許 允許
read committed
允許 允許
repeatable read
允許serializable
read uncommitted 提供非阻塞讀 允許髒讀。
read committed 事務只能讀取資料庫中已經提交的資料,所以沒有髒讀,但可能有不可重複讀和幻讀(與事務早期相比,查詢不光能看到其它提交事務更新的行,還能看到新插入的行),還有一點就是,如果在一條語句中查詢了多行,除oracle以外的其它資料庫都可能 「退化」成像髒讀一樣,並且寫阻塞讀,產生等待,並且資料是錯誤的。
repeatable read(可重複讀) 保證讀一致(read-consistent) 在非oracle資料庫中
為達可重複讀,需要阻塞乙個事務,並且順序執行兩個事務,這是使用共亨鎖來實現,這樣,讀會阻塞寫,且寫會阻塞讀,影響併發性,而且會產生死鎖。
serializable 就像乙個使用者一樣地操作
上而說的都是非oracle存在的缺點,在oracle中有三個級別
oracle實現原理:得用undo段實現資料多版本,來得到讀一致性,並且支援非阻塞讀,高併發性,魚和熊掌兼得。
1)、read committed 結果級別非上而提到的級別,不會髒讀,不可重複讀,幻讀,這是oracle預設的級別。
2)、read only(唯讀) 相當於無法在sql完成任何修改的repeatable read或
serializable,唯一的區別是read only事務不行修改,因此沒有去3)點中的ora-08177錯誤,但他不能防止其它事務的修改,如果undo太小的話,有可能重用undo段,並導致ora-15555:snaphot too old錯誤,所以設定足夠大的undo大小。
3)、serializable 原本是語句級的讀一致性,擴充套件到事務級,結果並非相對開始的那個時間點一致,而是在事務開始的那一刻就固定了,這是有代價的,只要你試圖更新某一行,而這行自事務開始後已經修改,你就會得到ora-08177 cant't serialize access for this transaction錯誤(同一塊的所有行修改都可能導致這個錯誤)為避免這個錯誤,可以用
select ... for update
,實現序列訪問,但這也並不意味是serializalble等同與序列順序並且總能得到相同的結果。
時間會話1執行
會話2執行 t1
alter session set isolation =_level = serializable
t2 alter session set isolation =_level = serializable t3
insert into a select count(*) from b
t4 insert into a select count(*) from b t5
commit
t6 commit
結果表a和表b都有乙個為0的行
注意以sys使用者或sysdba連線的使用者不能有read only或serializable的事務。
4、永續性(durability)
就是資料持久化了,即資料已寫入磁碟,資料不會再丟失。
二、事務的狀態變遷圖
1、活動狀態
在事務開始執行後,立即進入「活動」狀態(active),在活動狀態,事務將執行對資料庫的讀/寫操作,但是「寫操作」並不寫入磁碟,很可能暫時存放在系統的緩衝區中。
2、區域性提交狀態
事務最後一語句執行之後,進入「區域性提交」狀態(partially committed)。
事務是執行完了,但是對資料庫的修改,很可能還留在記憶體的系統緩衝區中,所以還不能說事務真正的結束,只能先進入區域性提交狀態。
3、失敗狀態
處於活動的事務還沒有到達最後乙個語句就中止執行,此時稱事務進入「失敗」狀態(fialed)。或者處於區域性提交狀態的事務,遇到故障(如發生干擾,或未能完成對資料庫的修改),也進入失敗狀態。
4、異常中止狀態
處於失敗狀態的事務,很可能已對磁碟中的資料庫進行了一部分修改。為了保證事務的原子性,應該撤銷(undo操作)該事務對資料庫已作的修改。對事務的撤銷操作稱為事務的回退(rollback)。
在oracle中,先得用redo日誌前滾事務,把在redo日誌中標誌已提交未和未提交的事務重做一遍,其中把未提交的資料利用redo日誌中記錄的undo資訊回滾事務,這樣保證的資料庫事務的完整性,一致性。
如何做到以上的恢復過程呢,有如下重要兩點。
1)、至少要等待相應修改的記錄寫入到redo日誌中,才能允許事務往資料中寫修改記錄。
2)、直到事務的所有修改記錄都已經寫到redo日誌後,才能允許事務完成commit處理。
5、提交狀態
事務成功提交了,所以資訊寫入磁碟,持久化資料。
三、補充知識 點
1)、一致讀:再查詢時,資料已修改,要從undo獲取舊資料。
2)、當前讀:更新時,更新條件的字段已修改,由於讀一致,要重新獲取最新資料。
3)、寫一致會導致重啟動,條件欄位有修改時,非條件字段修改不會。
4)、 解髮器想用:new和:old時,會比較一致讀值和當前讀值,並發現在二者不同,會帶來重啟動。
5)、不要在觸發器裡使用自治事務,自治事務不會因為重啟動而回滾。
6)、事務提交要以業務完成性,一致性為參照,並分析系統發現最大的事務是什麼,並設定相應的undo段大小,不要在迴圈中提交,導致資料不一致,因為
他可能導致:ora-01555錯誤,使更新處於一種完全未知的狀態,然是段太小的話還好,但會產生:ora-30036錯誤,但只要你設定足夠大的undo段,這個錯誤完成可以避免。
7)、分布式事務中(2pc)時,可能會出現「可疑分布事務」,發生在,協調結點收到所有結果投票提交事務結果時,要將結果發布給所以結點時,網路中斷時,這樣要dba手動提交「可疑分布事務」。
8)、自動事可以做審計,oracle的audit也提供的這個能力。
9)、決定事務大小的關鍵是資料的完整性。
Oracle 事務隔離級別
先看一張concepts中關於事務隔離級別的一張 從上圖可以看到 通常事務的隔離級別定義為以下4種 基於3種在併發事務中需要避免的現象來劃分的 1.read uncommitted 從字面意義可以看出,讀取那些未提交的資料。事務1在事務進行過程中,會讀到事務2修改了但是沒有提交的資料,所以產生了 髒...
Oracle事務隔離級別
髒讀 dirty read 當乙個事務讀取另乙個事務尚未提交的修改時,產生髒讀。不可重複讀 nonrepeatable read 同一查詢在同一事務中多次進行,在此期間,由於其他事務提交了對資料的修改或刪除,每次返回不同的結果。幻讀 phantom read 同一查詢在同一事務中多次進行,由於其他提...
oracle事務隔離級別 SERIALIZABLE
serializable 一般認為這是最受限的隔離級別,但是它也提供了最高程度的隔離性。serializable事務在乙個環境中操作時,就好像沒有別的使用者在修改資料庫中的資料一樣。我們讀取的所有行在重新讀取時都肯定完全一樣,所執行的查詢在整個事務期間也總能返回相同的結果。serializable這...