標籤:重做 事物 串連 免費 功能 重啟 roc 結果 擷取
控制事務
銀行轉賬
李四給張三匯款
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 事物的控制