控制事務sql
銀行轉帳數據庫
李四給張三匯款oracle
ACIDide
A:原子性:整個事務中全部的步驟是不可分割的,原子性原則規定一個事務的各個步驟都必須完成,不然整個事務都不會完成。即保證一個事務中全部的操做都能完成或者都不能完成,若是事務在完成以前出現任何錯誤,那麼數據庫自身必須保證自動回滾所作過的任何事務部分(而且必須自動進行)工具
C:一致性:不管是事務前,事務中,事務後,數據始終處於一致的狀態。例如李四給張三匯款10000,那麼就須要從李四帳戶減去10000,給張三的帳戶增長10000。Oracle使用撤銷段來保證數據的一致性。3d
I:隔離性:隔離性的原則規定,未完成的事務必須不可視。在某個事務進行期間,只有執行該事務的會話能看見所作的變化,而其餘全部的會話看見的都是沒有變化的數據(而不是更改後的新值)。這個規定的邏輯含義是:首先,因爲整個事務可能沒有所有完成,所以不容許其餘用戶看到可能回滾的變化;其次,在某個事務進行期間,數據是不連貫的,李四的帳戶減掉10000,但張三的帳戶尚未增長10000。事務的隔離性要求數據庫必須對其餘用戶隱藏正在進行的事務,這些用戶只能看到沒有被更新的數據,只有在事務完成時,他們才能看到全部變化。Oracle使用撤銷段來保證事務的隔離性。日誌
建立練習環境:建立一個aa表,插入3條記錄,並提交事物。
查看aa表的記錄,插入一條記錄,當咱們執行一條DML語句時候,就自動開始了一個事物
此時insert記錄的事務並無提交,沒有提交事務就沒有真正的完成,此時還有rollback的機會。對象
Scott用戶在當前會話中查看aa表時能夠看到被插入的記錄
打開一個新的sqlplus會話,查看aa表時會發現並無新插入的記錄:這是事物的隔離性
在第一個sqlplus會話中提交事物
提交以後才能在第二個會話中看到被插入的第四條記錄
D:持久性:一旦使用commit命令來結束某個事務,那麼就必須保證數據庫不丟失這個事務。在事務進行期間,隔離性的原則要求除了指定會話涉及的用戶以外的任何用戶都不能查看當前所作的變化。不過事務一旦完成,全部用戶都必須可以當即看到所作的變化,同時數據庫必須保證這些變化毫不會丟失。Oracle經過使用日誌文件來知足這個需求。日誌文件具備兩blog
種形式:聯機重作日誌文件,歸檔重作日誌文件。進程
一個正確配置的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進程會將變化的數據塊寫入磁盤。
3.自動提交和隱式提交:oracle在某些狀況下能夠進行自動提交:執行DDL語句是一種狀況,退出某個用戶進程也是一種自動提交。
若是對此有興趣,請掃下面二維碼免費獲取更多詳情