事務是對數據庫操作的邏輯單位,在一個事務中可以包含一條或多條DML (數據操縱語言)、DDL (數據定義語言)和DCL (數據控制語言)語句,這些語句組成一個邏輯整體。
事務的執行只有兩種結果:要麼全部執行,把數據庫帶入一個新的狀態,要麼全部不執行,對數據庫不做任何修改。
對事務的操作有兩個:提交( COMMIT )和回滾( ROLLBACK )。
提交事務時,對數據庫所做的修改便永久寫入數據庫。
回滾事務時,對數據庫所做的修改全部撤銷,數據庫恢復到操作前的狀態。
事務可用於操作數據庫的任何場合,包括應用程序、存儲過程、觸發器等。
事務具有四個屬性,這四個屬性的英文單詞首字母合在一起就是ACID 。
這四個屬性是:
·原子性( Atomicity ):事務要麼全部執行,要麼全部不執行,不允許部分執行。
·一致性( Consistency ):事務把數據庫從一個一致狀態帶入另一個一致狀態。
·獨立性( Isolation ):一個事務的執行不受其他事務的影響。
·持續性( Durability ):一旦事務提交,就永久有效,不受關機等情況的影響。
一個事務中可以包含多條DML語句,或者包含一條DDL語句,或者包含一條DCL語句。
事務開始於第一條SQL語句,在下列之一情況下結束:
·遇到COMMIT或ROLLBACK 命令。
·遇到一條DDL或者DCL命令。
·系統發生錯誤、退出或者崩潰。
總之,事務是一系列可以把系統帶入一個新的狀態的操作,如果事務被提交,則數據庫進入一個新的狀態,否則數據庫恢復到事務以前的狀態。
在數據庫中使用事務的好處是首先可以確保數據的一致性,其次在對數據做永久修改之前可以預覽以前的數據改變,還可以將邏輯上相關的操作進行分組。
控制事務的方式有兩種,一種是隱式控制,數據庫管理系統根據實際情況決定提交事務還是回滾事務;
另一種方式是顯式控制,在事務的最後放置一條COMMIT或ROLLBACK命令,將事務提交或回滾。
如果是隱式控制,那麼事務在遇到一條DDL命令,如CREATE ,或者遇到一條DCL 命令,如GRANT ,或者從SQL *Plus正常退出,即使沒有發出COMMIT或ROLLBACK命令,這個事務將被自動提交。
如果從SQL*Plus非正常退出或發生系統崩潰,那麼系統將自動回滾事務。
如果是顯式控制,那麼在事務的最後就要通過COMMIT命令提交事務,或者通過一條ROLLBACK命令回滾事務。
如果事務被提交,那麼對數據庫所作的修改將寫人數據庫。
如果回滾事務,一般情況下將回滾到事務的開始,即對數據庫不做任何修改。
在Oracle 中,允許部分回滾事務,即可以將事務有選擇地回滾到中間的某個點。
部分回滾是通過設置保存點( SAVEPOINT )來實現的。
事務中可以通過SAVEPOINT命令設置若干個保存點,這樣可以將事務有選擇地回滾到某一個保存點。
用戶訪問數據庫時,數據庫中的數據是放在緩沖區中的,當前用戶可以通過查詢操作,浏覽對數據操作的結果。
如果沒有提交事務,其他用戶是看不到事務的修改結果的。
當一個用戶修改表中的數據時,將對被修改的數據加鎖,其他用戶無法在此期間對該行數據進行修改,直到這個用戶提交或回攘這個事務。
如果在事務的最後執行了COMMIT命令,則對數據的修改將被寫入數據庫,以前的數據將永久丟失,無法恢復,其他用戶都可以浏覽修改後的結果,在數據上加的鎖被釋放,其他用戶可以對數據執行新的修改,在事務中設置的所有保存點將被刪除
如果在事務中設置了保存點,並且在事務的最後執行ROLLBACK命令回滾到某個保存點,那麼在此保存點之後的DML語句所做的修改將被丟棄,但是在此保存點之前的DML語句所做的修改仍然沒有寫入數據庫,還可以進行提交或回滾。