oracle事務

追求完美9196發表於2024-06-19

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例項的變化

  1. 事務開始
  2. 在共享池中查詢對應的已經編譯過的執行計劃。如果沒有找到,則生成執行計劃
  3. 在資料庫快取記憶體中查詢對應的資料塊,如果沒有找到,就從資料檔案中讀取對應的資料塊,載入到資料庫快取記憶體中
  4. 在資料庫快取記憶體中修改對應的資料塊,這些塊就變成了髒塊。同時在redo快取中生成redo日誌
  5. 當事務提交時,等待redo快取中的對應的redo日誌全部寫入到線上重做日誌檔案,寫入完成後返回提交成功資訊
  6. 當發生checkpoint時,DBWn程序會將對應的髒塊寫入到資料檔案中。寫入後CKPT程序更新資料檔案和控制檔案中的SCN資訊

相關文章