首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 巢狀交易與自主交易:解決函數產生流水號回滾遺漏難題

     編輯:Oracle 資料庫基礎

巢狀呼叫下的資料完整性挑戰

典型情境:存儲程序 Proc_SaveBill 儲存單據,呼叫函數 Func_GenerateCode 從序號表取得最大值並 +1 產生單號。若後續儲存失敗,序號已遞增導致「斷號」;若使用交易回滾,卻發現函數若含 COMMIT 則無法回滾,因交易只能回滾至上一個 COMMIT/ROLLBACK。

自主交易:獨立交易上下文的解決方案

Oracle 提供 自主交易 機制,讓子程式在獨立交易區塊提交/回滾,不影響主交易。宣告方式:

CREATE OR REPLACE FUNCTION Func_GenerateCode RETURN VARCHAR2 IS
  PRAGMA AUTONOMOUS_TRANSACTION; -- 宣告自主交易
  v_code VARCHAR2(20);
BEGIN
  -- 取得序號、更新序號表
  UPDATE seq_table SET max_no = max_no + 1 WHERE id = 'BILL_NO'
  RETURNING max_no INTO v_code;
  COMMIT; -- 僅提交自主交易
  RETURN 'BILL' || v_code;
END;

關鍵行為差異

情境一般函數/程序自主交易
子程式含 COMMIT主交易無法回滾子程式變更子程式獨立提交,主交易回滾不影響
子程式無 COMMIT主交易 ROLLBACK 可回滾子程式仍需在子程式明確 COMMIT/ROLLBACK
巢狀存儲程序呼叫被呼叫者無錯誤則無法回滾各自管理交易邊界

適用場景與注意事項

  • 序號產生、稽核日誌寫入、獨立計算邏輯——需「必須成功」或「不可回滾」的操作。
  • 濫用自主交易會導致資料不一致,僅在明確需要獨立提交時使用。
  • 主交易回滾時,自主交易已提交的資料不會回滾,設計時務必評估業務語意。

掌握自主交易是 PL/SQL 進階開發的關鍵技能,能優雅解決巢狀呼叫下的資料完整性難題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved