【1.事務隔離】 ①一個未提交的事務所作的修改不能被其它事務所看到。只有當事務提交成功後,在該事務以後執行的其它事務纔可能看到該事務所作的改變。 ②在該事務提交以前已經執行了一部分而另外一部分在該事務提交後執行的剩餘部分一樣也看不到該事務作出的改變。這是另外一個Oracle特性:讀一致和快照。 ③在該事務提交同時進行的其它事務一樣也看不到該事務所作的改變。 【2.語句級回滾】 ①當一個SQL語句在執行期間由於發生的任何錯誤而中斷時,將產生一個「語句級回滾」。該回滾的後果就像這個SQL語句根本沒有執行過同樣。 ②注意回滾是發生在「執行」階段的,若是是在SQL語句的解析階段由於語法問題而沒法執行。由於沒有產生任何影響而不會出現「回滾」。 【3.事務控制的分割】 若是一個事務中包含了DML語句和DDL語句,那麼該事務會被分解成多個事務。首先在DDL以前的全部DML語句會被做爲一個事務而一次性提交。而後Oracle會爲這個DDL建立一個新的,單語句的事務。若是DDL語句執行失敗了,那麼DML事務依然成功。 【4.不一樣狀況下的事務控制】 請注意:用戶從Oracle服務器斷開鏈接和用戶進程強行中斷的後果是不一樣的。 ①前者典型的例子是Oracle服務器關閉或重啓,此時全部未提交事務會被提交。 ②後者典型的例子用戶經過進程管理器強行kill掉進程,此時全部未提交事務所作的操做被回滾。 【5.事務提交前要作的事情】 Oracle提交一個事務以前,必須作如下幾件事情: ①記住數據被修改前是什麼樣子的 ②記住數據即將要被改爲什麼樣子 ③記住redo log和undo log的關聯 ④將SGA中已讀取到內存的數據修改成新的值(此時並未真正保存到數據文件) 其中第一步是經過在undo表空間中記錄undo日誌來完成的。第二步、第三步是經過向SGA中的redo日誌緩衝區寫記錄來完成的。這樣當事務回滾時就能夠從redo日誌找到對應的undo日誌,從而找回以前的數據 ★要特別注意的是:此時不必定會觸發DBWn進程。 ★要特別注意的另外一個地方是:第2步記錄事務操做的改變是內存中進行的,還未寫到磁盤上的redo日誌文件 【6.事務提交時所作的事情】 ①記錄SCN值(System Change Number) ②將在線重作日誌記錄(位於SGA的redo日誌緩衝區中)持久化到redo日誌文件 ③Oracle釋放資源和鎖 ④Oracle將事務標記爲已結束 注意:只有在commit指令被髮出後,纔會將SGA中重作日誌緩衝區的內容刷新到磁盤的redo日誌文件。在LGWR進程執行前,重作日誌一直存在於內存中,也被稱爲在線重作日誌。 【7.savepoint回滾和整個事務的回滾】 注意當Oracle事務回滾到某個savepoint時,在savepoint以後的全部後續savepoint將失效。但此時Transaction仍是活躍且可繼續的。這一點不一樣於整個事務的回滾。 【8.自治事務】 從傳統上來講,一個事務只有在完整執行成功或回滾以後,纔會進行下一個事務。而自治事務容許在一個事務中調用運行另外一個事務,被調用事務執行完成後,調用事務繼續執行以前未完成的操做直至事務結束 自治事務在被調用後,將和外圍事務徹底獨立。彼此之間並不共享任何資源或者鎖,外圍事務全部未提交的改變對自治事務來講都是不可見。自治事務提交後外圍事務將能夠看到改變