- Oracle從新手到高手
- 楊繼萍
- 1630字
- 2019-12-09 14:49:04
4.5 Oracle中的事務處理
在Oracle系統(tǒng)中,在使用INSERT、UPDATE和DELETE語句操作數(shù)據(jù)時,數(shù)據(jù)庫中的數(shù)據(jù)并不會立即改變,用戶還可以通過控制事務確認是否提交或取消先前的操作。
4.5.1 事務的基本概念
事務是數(shù)據(jù)庫系統(tǒng)工作的一個邏輯單元,它由一個或多個SQL語句組成。對于數(shù)據(jù)庫而言,事務是不可分割的工作單元,一個事務中的所有SQL語句要么全部執(zhí)行,要么全部不執(zhí)行。也就是說,當事務被提交后,該事務中的操作才真正被保存到數(shù)據(jù)庫中。如果某個事務被回退了,那么該事務中的所有操作都被取消。事務的回退和提交可以由用戶顯式執(zhí)行,也可以隱式地執(zhí)行。
一般情況下,用戶或應用程序需要顯式地執(zhí)行COMMIT語句提交事務,但是用戶也可以不使用COMMIT語句而隱式地提交事務。例如,在事務的結(jié)尾處使用DDL語句時,Oracle默認為提交當前的事務,并且開始一個新的事務。只有當事務被提交后,其他用戶才能夠看到對數(shù)據(jù)庫的修改結(jié)果。下面將啟動兩個SQL*Plus會話來演示Oracle的事務處理特性。
① 啟動SQL*Plus,使用SCOTT身份連接數(shù)據(jù)庫,并且向EMP表添加一些數(shù)據(jù),如下所示。

② 在該會話中執(zhí)行如下的查詢時,用戶可以看到先前插入的數(shù)據(jù)。

③ 現(xiàn)在打開另一個SQL*Plus,并且保持第一個SQL*Plus不被關(guān)閉。在第二個SQL*Plus中執(zhí)行相同的SELECT語句,以查看先前插入的數(shù)據(jù)。

在這里可以發(fā)現(xiàn),由于第一個會話沒有提交事務,所以在第二個會話中看不到第一個會話添加數(shù)據(jù)。
④ 在第一個SQL*Plus中使用COMMIT語句提交事務。
SQL> commit; 提交完成。
⑤ 現(xiàn)在,如果用戶再次在第二個SQL*Plus中運行上面的SELECT語句,就會看到在第一個SQL*Plus中所提交的數(shù)據(jù)。
4.5.2 事務控制
Oracle中的事務是隱式自動開始的,它不需要用戶顯式地使用語句開始事務處理。當發(fā)生如下情況時,Oracle認為一個事務結(jié)束。
※ 執(zhí)行COMMIT語句提交事務。
※ 執(zhí)行ROLLBACK語句撤銷事務。
※ 執(zhí)行一條數(shù)據(jù)定義語句(如CREAE、DROP或ALTER語句等)。如果該語句執(zhí)行成功,那么表示系統(tǒng)自動執(zhí)行COMMIT命令;如果這種操作失敗,那么表示系統(tǒng)自動執(zhí)行ROLLBACK命令。
※ 執(zhí)行一個數(shù)據(jù)控制命令(如GRANT、REVOKE等),這種操作表示自動執(zhí)行COMMIT命令。
※ 斷開數(shù)據(jù)庫的連接。如果使用EXIT命令正常退出SQL*Plus,則系統(tǒng)自動執(zhí)行COMMIT命令;如果退出SQL*Plus出現(xiàn)異常,則系統(tǒng)自動執(zhí)行ROLLBACK命令。
下面主要介紹通過ROLLBACK語句控制事務。
1. 使用COMMIT語句提交事務
提交事務也就意味著該事務中對數(shù)據(jù)庫進行的全部操作將永久地記錄在數(shù)據(jù)庫中。在使用COMMIT提交事務時,Oracle會執(zhí)行如下操作。
① 在回退段內(nèi)記錄事務已經(jīng)提交,并且生成一個唯一的系統(tǒng)變改號(SCN),以唯一標識這個事務。
② 啟動LGWR后臺進程,將SGA區(qū)中的重做日志緩存中的數(shù)據(jù)寫入聯(lián)機重做日志文件中,并且將該事務的SCN也保存到聯(lián)機重做日志文件中。
③ Oracle服務器進程釋放事務處理所占用的資源。
④ 通知用戶事務已經(jīng)成功提交。
需要注意,Oracle提交事務的性能不會因為事務所包含的SQL語句過多而受到影響,因為Oracle采用了一種稱為“快速提交”(Fast Commit)的機制,當用戶提交事務時,Oracle并不會將與該事務相關(guān)的“臟數(shù)據(jù)塊”立即寫入數(shù)據(jù)文件,只是將相應的日志信息保存到重做日志文件,這樣即使發(fā)生錯誤丟失了內(nèi)存中的數(shù)據(jù),系統(tǒng)還可以根據(jù)重做日志文件中的信息對其進行還原。因此,只要事務的重做日志信息被完全寫入聯(lián)機重做日志文件中,即可認為該事務已經(jīng)成功提交。
2. 回退事務
回退一個事務也就意味著在該事務中對數(shù)據(jù)庫進行的全部操作將被取消,Oracle利用回退段(或撤銷表空間)來存儲修改前的數(shù)據(jù),通過重做日志來記錄對數(shù)據(jù)所做的修改。如果要回退整個事務,Oracle將會執(zhí)行如下操作。
① 使用回退段中的數(shù)據(jù)撤銷事務中所有SQL語句對數(shù)據(jù)庫所做的修改。
② Oracle服務進程釋放事務所占用的資源。
③ 通知用戶事務回退成功。
Oracle不僅允許回退整個未提交的事務,還允許回退事務的一部分,這是通過一種稱為“保存點”的機制實現(xiàn)的。在事務的執(zhí)行過程中,用戶可以通過建立保存點將一個較長的事務分隔為幾部分。這樣用戶就可以有選擇性地回退到某個保存點,而保存點之后的操作都將被取消。
在下面的示例,將向SCOTT模式中的EMP表添加兩行記錄,并且在執(zhí)行第一條INSERT語句后建立一個保存點,在第二條INSERT語句后查詢當前事務對數(shù)據(jù)庫所做的操作。隨后回退事務到保存點,以撤銷第二條INSERT語句所執(zhí)行的操作。

- Mastering Concurrency Programming with Java 8
- SPSS數(shù)據(jù)挖掘與案例分析應用實踐
- Implementing Modern DevOps
- Mastering Entity Framework Core 2.0
- 測試驅(qū)動開發(fā):入門、實戰(zhàn)與進階
- What's New in TensorFlow 2.0
- OpenShift開發(fā)指南(原書第2版)
- 數(shù)據(jù)結(jié)構(gòu)(Java語言描述)
- Hands-On Swift 5 Microservices Development
- Python算法指南:程序員經(jīng)典算法分析與實現(xiàn)
- C語言程序設(shè)計上機指導與習題解答(第2版)
- Orleans:構(gòu)建高性能分布式Actor服務
- Python Interviews
- Vue.js應用測試
- Java 從入門到項目實踐(超值版)