Oracle 11g R2 事物的控制
銀行轉賬
李四給張三匯款
ACID
A:原子性:整個事務中所有的步驟是不可分割的,原子性原則規定一個事務的各個步驟都必須完成,否則整個事務都不會完成。即保證一個事務中所有的操作都能完成或者都不能完成,如果事務在完成之前出現任何錯誤,那麽數據庫自身必須保證自動回滾所做過的任何事務部分(並且必須自動進行)
C:一致性:無論是事務前,事務中,事務後,數據始終處於一致的狀態。例如李四給張三匯款10000,那麽就需要從李四賬戶減去10000,給張三的賬戶增加10000。Oracle使用撤銷段來保證數據的一致性。
I:隔離性:隔離性的原則規定,未完成的事務必須不可視。在某個事務進行期間,只有執行該事務的會話能看見所做的變化,而其他所有的會話看見的都是沒有變化的數據(而不是更改後的新值)。這個規定的邏輯含義是:首先,由於整個事務可能沒有全部完成,因此不允許其他用戶看到可能回滾的變化;其次,在某個事務進行期間,數據是不連貫的,李四的賬戶減掉10000,但張三的賬戶還沒有增加10000。事務的隔離性要求數據庫必須對其他用戶隱藏正在進行的事務,這些用戶只能看到沒有被更新的數據,只有在事務完成時,他們才能看到所有變化。Oracle使用撤銷段來保證事務的隔離性。
創建練習環境:創建一個aa表,插入3條記錄,並提交事物。
查看aa表的記錄,插入一條記錄,當我們執行一條DML語句時候,就自動開始了一個事物
此時insert記錄的事務並沒有提交,沒有提交事務就沒有真正的完成,此時還有rollback的機會。
Scott用戶在當前會話中查看aa表時可以看到被插入的記錄
打開一個新的sqlplus會話,查看aa表時會發現並沒有新插入的記錄:這是事物的隔離性
在第一個sqlplus會話中提交事物
提交之後才能在第二個會話中看到被插入的第四條記錄
D:持久性:一旦使用commit命令來結束某個事務,那麽就必須保證數據庫不丟失這個事務。在事務進行期間,隔離性的原則要求除了指定會話涉及的用戶之外的任何用戶都不能查看當前所做的變化。不過事務一旦完成,所有用戶都必須能夠立即看到所做的變化,同時數據庫必須保證這些變化絕不會丟失。Oracle通過使用日誌文件來滿足這個需求。日誌文件具有兩
種形式:聯機重做日誌文件,歸檔重做日誌文件。
一個正確配置的oracle數據庫是不可能丟失數據的。當然用戶的錯誤(包括不恰當的DML或刪除對象)也會造成數據的丟失
DDL語句有自動提交功能(create、drop、truncate、alter)
創建表AA,插入一條記錄
回退事物
在表中插入一條記錄
在sqlplus中正常退出
在另外一個sqlplus中查看aa表中的記錄,會發現新插入的tom1的記錄了。如果使用sqlplus工具更改了數據之後,正常退出sqlplus時,oracle會自動提交事物。
目前aa表中只有tom1的記錄
模擬實例重啟
使用scott用戶連接,查看aa表中的內容,發現insert tom2的記錄由於實例重啟自動被回滾了。
使用autocommit實現事物的自動提交
即使執行回滾,查詢結果仍然包含新插入的數據,關閉自動提交時可以使用set autocommit off
關於事物的總結:
-
需要註意的是,Commit:只是用來確認這個數據已經正式的修改了,不一定非得寫入硬盤,DBWn什麽都不做。執行commit命令時發生的所有物理操作時LGWR進程將日誌緩沖區的內容寫入磁盤。DBWN進程完全沒有執行任何操作。DBWN進程與提交事物處理沒有關系,不過最終DBWN進程會將變化的數據塊寫入磁盤。
- commit和rollback語句只應於DML語句,我們無法回滾DDL語句。DDL語句一旦被執行就會立即具有持久狀態。
3.自動提交和隱式提交:oracle在某些情況下可以進行自動提交:執行DDL語句是一種情況,退出某個用戶進程也是一種自動提交。
如果對此有興趣,請掃下面二維碼免費獲取更多詳情
Oracle 11g R2 事物的控制