程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 深入了解Oracle事務

深入了解Oracle事務

編輯:Oracle數據庫基礎

Oracle事務的對於Oracle數據庫的重要性不言而喻,下面就將為您詳細介紹Oracle事務方面的知識,供您參考學習之用。

1.Oracle事務隔離

①一個未提交的事務所做的修改不能被其它事務所看到。只有當事務提交成功後,在該事務之後執行的其它事務才可能看到該事務所做的改變。
②在該事務提交之前已經執行了一部分而另一部分在該事務提交後執行的剩余部分同樣也看不到該事務做出的改變。這是另一個Oracle特性:讀一致和快照。

③在該事務提交同時進行的其它事務同樣也看不到該事務所做的改變。

2.語句級回滾

①當一個SQL語句在執行期間因為發生的任何錯誤而中斷時,將產生一個“語句級回滾”。該回滾的後果就像這個SQL語句根本沒有執行過一樣。

②注意回滾是發生在“執行”階段的,如果是在SQL語句的解析階段因為語法問題而無法執行。因為沒有產生任何影響而不會出現“回滾”。

3.Oracle事務控制的分割( Oracle沒有明顯的事務開始,結束的語句塊,它將自動形成事務塊。 )

如果一個事務中包含了DML語句和DDL語句,那麼該事務會被分解成多個事務。首先在DDL之前的所有DML語句會被作為一個事務而一次性提交。然後Oracle會為這個DDL創建一個新的,單語句的事務。如果DDL語句執行失敗了,那麼DML事務依然成功。 每個DDL語句單獨成為一個事務,也就是說DDL語句不能回退。

4.不同情況下的Oracle事務控制

請注意:用戶從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.自治事務

從傳統上來說,一個事務只有在完整執行成功或回滾之後,才會進行下一個事務。而自治事務允許在一個事務中調用運行另一個事務,被調用事務執行完成後,調用事務繼續執行之前未完成的操作直至事務結束

自治事務在被調用後,將和外圍事務完全獨立。彼此之間並不共享任何資源或者鎖,外圍事務所有未提交的改變對自治事務來說都是不可見。自治事務提交後外圍事務將可以看到改變。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved