1 事務的概念
事務是將資料庫從一種一致性狀態轉變為另外一種一致性狀態
2 事務的四個特徵(ACID)
- 原子性(Atomicity):事務的所有執行要麼一起成功,要麼一起失敗
- 一致性(Consistency):事務將資料從一種一致性狀態轉為另外一種一致性狀態
- 隔離性(Isolation):事務中所有修改未提交的資料對其他事務是不可見的
- 永續性(Durability):事務一旦提交,資料就永久儲存
2.1 DDL與原子性
DDL語句執行之前,會先自動執行一個commit,再執行DDL語句本身。
2.2 COMMIT_WAIT與永續性
oracle的永續性是依靠redo來保證的。一般情況下,commit執行時,只有資料對應的redo快取寫入到redo線上重做日誌後,才會給客戶端返回commit成功的資訊。
COMMIT_WAIT引數有三個值WAIT、NOWAIT和FORCE_WAIT。當COMMIT_WAIT設定為NOWAIT時,commit執行時資料庫無需等待redo快取寫入到redo線上重做日誌,直接給客戶端返回commit成功的資訊。但是,這樣子做,無法保證資料的永續性。因為此時commit成功,redo快取並沒有寫入到redo線上重做日誌。如果此時資料庫突然關閉,這次修改的資料無法透過redo進行恢復。
3 分散式事務
有時候,我們會使用DBLINK聯合其他伺服器上的oracle資料庫執行一個事務。這種分散式事務,oracle是透過2PC(Two-Phase Commit Protocol,兩階段提交協議)實現事務的原子性的。2PC原理是oracle在處理分散式事務時,會指定一個資料庫作為協調者,這個協調者在提交事務時,會詢問各個資料庫是否做好提交。如果每個資料庫都回復確定提交,協調者告訴各個資料庫進行提交。如果其他資料庫有回覆不可以提交,則協調者會讓各個資料庫進行回滾。
4 自治事務
當一個事務為自治事務時,這個事務的提交和回滾都不會影響父事務。例如,我們有如下一個自治事務的儲存過程(使用pragma autonomous_transaction宣告)
create or replace procedure Autonomous_Insert as
pragma autonomous_transaction;
begin
insert into bk_test values (2);
commit;
end;
我們執行如下SQL
begin
insert into bk_test values(1);
Autonomous_Insert;
rollback;
end;
查詢結果
可見,剛才那段sql最後一個rollback,只回滾了資料為1的資料。Autonomous_Insert中的commit成功插入了資料2,卻沒有將父事務中的資料1進行commit。可見,Autonomous_Insert中的commit對於父事務是獨立提交的。
5 事務過程中oracle例項的變化
- 事務開始
- 在共享池中查詢對應的已經編譯過的執行計劃。如果沒有找到,則生成執行計劃
- 在資料庫快取記憶體中查詢對應的資料塊,如果沒有找到,就從資料檔案中讀取對應的資料塊,載入到資料庫快取記憶體中
- 在資料庫快取記憶體中修改對應的資料塊,這些塊就變成了髒塊。同時在redo快取中生成redo日誌
- 當事務提交時,等待redo快取中的對應的redo日誌全部寫入到線上重做日誌檔案,寫入完成後返回提交成功資訊
- 當發生checkpoint時,DBWn程序會將對應的髒塊寫入到資料檔案中。寫入後CKPT程序更新資料檔案和控制檔案中的SCN資訊