官术网_书友最值得收藏!

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í)行的操作。

主站蜘蛛池模板: 山东省| 常州市| 信丰县| 固镇县| 峨眉山市| 楚雄市| 紫阳县| 沿河| 潜山县| 时尚| 逊克县| 新绛县| 如皋市| 兴安盟| 宁波市| 安徽省| 交口县| 五峰| 深泽县| 普宁市| 南投市| 崇明县| 衡水市| 娄底市| 斗六市| 舞阳县| 佛教| 顺昌县| 托里县| 裕民县| 鹤壁市| 浏阳市| 二手房| 隆子县| 平塘县| 玛曲县| 堆龙德庆县| 新野县| 霍邱县| 乳山市| 苏尼特右旗|