在看本文之前,請確保你已經了解了Oracle事務和鎖的概念即其作用,不過不了解,請參考數據庫事務的一致性和原子性淺析和Oracle TM鎖和TX鎖
1、提交事務
當執行使用commit語句可以提交事務.當執行了commit語句后,會確認事務的變化、結束事務、刪除保存點、釋放鎖。在此之前,與當前事務相關的數據都會被加鎖,直到當前事務進行了commit操作,如果在這個過程中有其他回話試圖操作相關數據,(這些數據已經被當前事務加鎖),那么其他回話會進行等待,或者直接返回錯誤。
注意:只有在提交事務之后也就是進行commit操作之后,數據才會真正的發生改變,在commit提交之前操作,全部被記錄入Oracle日志系統
2、回退事務
在說回退事務之前,先說Oracle事務的保存點(savepoint)的概念和作用,保存點是事務中的一點,用於取消部分事務,保存點記錄的是當前數據庫的狀態
在事務commit提交前,可以使用rollback 到指定的保存點,來回退到指定的保存點
在事務commit提交后,保存點會被刪除,這個時候,就無法進行回退了
這里在使用保存點之前,強調一點,任何commit操作,也就是事務提交操作,都會導致savepoint的被刪除!!!
3、rollback to savepoint 取消部分事務
select * from test; savepoint a; ---創建回退點
接着刪除一條數據
delete from test where deptno=10
select * from test;
ok,depetno為10的那行數據被刪了,現在使用rollback+savepoint進行回退
rollback to a; select * from test;
數據又回來了,我在刪除數據之前,添加了一個會退點,然后進行刪除數據,接着發現那條數據不能刪,我就通過保存點返回到刪除數據之前的那個保存點所對應的數據庫狀態
4、rollback 取消全部事務
回退的機制和rollback to savepoint 一樣,但是使用rollback就是取消當前事務的全部操作,也就說當前事務先前的操作會全部被取消
5、只讀事務
只讀事務是指只允許執行查詢的操作,而不允許執行其他任何的DML操作,只讀事務可以幫助獲取某個時間點的數據。
例:假定機票代售點每天18點統計今天的銷售情況,這時可以使用只讀事務,在設置了只讀事務之后,盡管其他回話會提交新的事務,但是只讀事務不會獲取新的數據變化,從而保證取得特定時間點的數據信息。
口令:
set transaction read only
使用scott登錄的會話,設置只讀事務
ok,只讀事務設置完畢
現在我們用dba身份登錄sqlplus,創建一個會話,然后向scoot.dept表中插入一條新數據
ok,插入成功!
現在看看scott回話中,能不能插到dept中新添加的記錄;
scott會話,並沒有查到,新添加的記錄。
但是sysdba的回話中,數據已經添加了
ok,根據上面的代碼演示,我們可以得出,當一個事務被設置為只讀事務,那么當前事務只能查詢到這個時間點的數據記錄,就算有其他會話對數據記錄進行修改,也不會影響到只讀事務。