摘要:在ORACLE數據庫中,為了確保數據的完整性和一致性,提供了事務處理機制。該文詳細闡述了事務處理的運行機制和實現方法,最后用實例說明事務處理的整個過程,為程序員提供了一個用事務處理來保證數據正確統(tǒng)一的方法。
關鍵詞:事務處理;提交;回滾;保存點
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2013)15-3466-02
在ORACLE的PL/SQL程序設計過程中,經常會使用DML語句來操作數據庫,怎么才能確保數據庫不會因為意外或者誤操作損壞數據呢,以員工管理系統(tǒng)為例,其中有一張部門表和一張員工表,當我們刪除某個部門時,應該先刪除這個部門所有的員工,如果員工表沒有刪除成功而部門表中成功刪除,就破壞了數據,造成數據庫統(tǒng)計錯誤。同樣的道理,添加員工時,如果這個員工的部門不存在而添加成功,也會造成統(tǒng)計錯誤,使數據庫的數據變得混亂,影響此系統(tǒng)的正常運行,ORACLE為了確保數據的完整性和一致性,所以引入了事務處理的機制。
1 事務處理詳述
是由多個SQL語句組合成一起組成的邏輯工作單元,它負責執(zhí)行一系列對數據的操作。 這些對數據庫的所有操作如果全部成功完成,則永久更新,否則,只要有一條SQL語句執(zhí)行失敗,就不會更新當前數據,而會回滾到執(zhí)行前的狀態(tài)。這樣,就能使數據庫保持完整性和一致性,不會產生錯誤的數據。事務處理所組成的邏輯工作單元為了保證數據的一致性,那么其中每一個邏輯工作單位就必須要滿足ACID屬性,即原子性、一致性、隔離性和持久性。
1.1 原子性
原子性其實就是對事務的一個完整性操作,就好比一段順序執(zhí)行的程序,要么全部執(zhí)行完成,要么不執(zhí)行。如果執(zhí)行到中途遇到錯誤,則停止并且回到執(zhí)行前的狀態(tài)。例如在個人帳戶管理中,A帳戶支出500元給B帳戶,那么A帳戶就應該減少500元,B帳戶就應該增加500元,這個操作要么全部執(zhí)行成功,要么都不成功,這樣來確保這個事務是一個原子工作單位。
1.2 一致性
事務的一致性是指在事務完成的時候,對數據的相關操作在受影響的數據表的數據都會同時進行更新,保持數據的一致狀態(tài)。就如在剛才的例子當中,A帳戶和B帳戶在數據庫中每個表中的狀態(tài)都會同時發(fā)生改變,來保持數據的完整性。
1.3 隔離性
不同事務之間的運行是互不干擾的,是完全隔離執(zhí)行的,一個事務不會看到另一個事務發(fā)生的狀態(tài),也看不到中間狀態(tài)的數據。事務查看到的只能是數據修改前或或務執(zhí)行成功更新后的狀態(tài)。就如剛才的事例,要么看到A帳戶到B帳戶支出前的數據或者成功支出后的數據,對于A帳戶支出后,B帳戶沒有執(zhí)行完成的狀態(tài)是看不到的。這就是事務的隔離性。
1.4 持久性
事務的持久性是指如果一個事務已經成功提交后,數據庫中的數據就會成功更新,這種更新會永久的保存,即使系統(tǒng)遇到故障甚至機器崩潰,也不會影響數據庫的狀態(tài)。
2 提交事務(COMMIT)
在事務處理過程中,使用COMMIT語句會提交并結束一個事務處理。當執(zhí)行COMMIT語句后,數據庫的事務處理主要做了兩項工作:第一是將所有對數據庫的操作永久性的寫入數據庫,其他的用戶可以立即看到對數據庫所做的所有變化;第二是對于本事務的所有鎖定以及事務所占用的所有資源都會被自動的釋放出來,并且將此事務標記為已完成。
3 回滾事務(ROLLBACK)
事務的回滾就是取消已執(zhí)行的操作,并且回到操作前的狀態(tài)。例如在前面的例子中,A帳戶成功執(zhí)行了支出500元的操作,但遇了一些錯誤或問題,B帳戶并沒有增加金額,這是回滾就會撤消剛才的操作,回到A帳戶支出前的數據,并且終止事務的執(zhí)行。事務的回滾一般也是有兩種情況:第一是數據的誤刪除或誤更改來使用回滾撤消;第二是事務程序中設置的異常被觸發(fā),使用回滾恢復到數據初始狀態(tài)。
4 事務的保存點(SAVEPOINT)
事務的保存點主要用于回滾部分事務。因為在一個很大的PL/SQL程序設計過程中,如果執(zhí)行了很多的語句,使用回滾是非常占用時間和資源的。保存點可以在一個很大的程序中將一個事務分成很多語句塊,將每一塊設置為一個保存點,一旦程序發(fā)生錯誤,就會回滾到最近的保存點。在不可能發(fā)生錯誤的情況下,保存點很有用。在很少出現錯誤的情況下使用保存點回滾部分事務,比讓每個事務在更新之前測試更新的有效性更為有效。更新和回滾操作代價很大,因此只有在遇到錯誤的可能性很小,而且預先檢查更新的有效性的代價相對很高的情況下,使用保存點才會非常有效。
5 設置事務屬性(SET TRANSACTION)
SET TRANSACTION主要是用來設置一個事務的只讀或只寫的屬性,建立隔離的級別以及為當前的事務分配一個特寫的回滾段。它必須是事務處理中的第一條語句,而且只能出現一次。
6 事務處理的實例解析
下面的PL/SQL程序演示了事務的提交、回滾和保存點的實際使用方法。程序中使用了一個療養(yǎng)院信息管理系統(tǒng)的科室表(DEPT)和療養(yǎng)員入院登記表(PAT_VISIT)。例子中為了簡化,只列出部分字段,其中DEPT表中有DEPT_CODE科室代碼,DEPT_NAME科室名稱,INPUT_CODE檢索碼;PAT_VISIT表中有DEPT_CODE入院科室,PAT_NAME患者姓名,SEX性別,AGE年齡。
DECLARE
DEPT_CODE NUMBER(4):=1010; —定義部門編號保存變量
BEGIN
—事務開始
SAVEPOINT A; —保存點A
INSERT INTO DEPT VALUES (DEPT_CODE,'口腔科','KQK'); —插入科室記錄
SAVEPOINT B; —保存點B
INSERT INTO PAT_VISIT VALUES (DEPT_CODE,'張三','男',33); —插入患者入院記錄
SAVEPOINT C; —保存點C
INSERT INTO DEPT VALUES (DEPT_CODE,'心理科','XLK'); —插入相同編號的科室記錄
COMMIT; —提交事務
EXCEPTION —異常處理模塊
WHEN DUP_VAL_ON_INDEX THEN —捕獲異常
DBMS_OUTPUT.PUT_LING('不能插入相同編號的科室記錄'); —顯示異常信息
ROLLBACK TO B; —回滾到指寫的保存點
END;
程序的執(zhí)行情況說明:
1)程序在開始的時候定義了第一個保存點A,在第二個插入和第三個插入點分別定義了保存點B和保存點C。
2)保存點C執(zhí)行的語句違反了主鍵的唯一約束條件,于是觸發(fā)了異常,在異常的語句中,設置了回滾到保存點B的命令,所以插入科室記錄應該是成功的,而插入患者的操作會被回滾。當程序執(zhí)行完成后,我們查看數據表的數據,發(fā)覺口腔科已被正確插入到DEPT表中,而患者記錄并沒有被插入到PAT_VISIT表中。
在實際的事務處理運用中,要處理的數據量和復雜程度都要比這個大得多,這只是簡單的說明了一下事務處理的過程,只有正確的運用事務處理機制,才能更好的防止數據出現混亂,并且保持數據的一致性和完整性。
參考文獻:
[1] 王健,秦海龍. Oracle基于事務日志的數據恢復[J].內蒙古農業(yè)大學學報:自然科學版,2006(4).
[2] 劉大勇.利用Oracle的閃回功能恢復偶然丟失的數據[J]. 計算機與信息技術,2005(6).
[3] 林烈青.基于事務日志的數據庫恢復機制研究[J].現代計算機:專業(yè)版,2009(8).
[4] 龔松杰. Web服務事務處理模型研究[J].計算機工程,2007(10).