在 Oracle 資料庫中,標準事務遵循「原子性」原則:要麼全部提交,要麼全部回滾。這雖然保證了資料一致性,但卻帶來一個棘手的問題——當主事務失敗回滾時,寫入錯誤日誌的 INSERT 操作也會一併被撤銷,導致關鍵診斷資訊丟失,嚴重阻礙故障排查。
Oracle 提供的 PRAGMA AUTONOMOUS_TRANSACTION 正是為了解決此痛點而生。它允許在一個獨立的事務上下文中執行 SQL 操作,獨立提交或回滾,完全不影響主事務。這使其成為記錄錯誤日誌、審計追蹤等「必須持久化」操作的理想選擇。
COMMIT,但加上此 Pragma 後,觸發器內的語句可獨立提交(主事務不受影響)。CREATE TABLE errorlog (
errorlog_id NUMBER,
logged_on TIMESTAMP DEFAULT SYSTIMESTAMP,
logged_by VARCHAR2(30) DEFAULT USER,
num1 NUMBER, num2 NUMBER, num3 NUMBER,
text1 VARCHAR2(1000), text2 VARCHAR2(1000), text3 VARCHAR2(1000)
);
CREATE SEQUENCE errorlog_seq START WITH 1 INCREMENT BY 1;
CREATE OR REPLACE PROCEDURE log_error (
n1 IN NUMBER := NULL, t1 IN VARCHAR2 := NULL,
n2 IN NUMBER := NULL, t2 IN VARCHAR2 := NULL,
n3 IN NUMBER := NULL, t3 IN VARCHAR2 := NULL
) IS
PRAGMA AUTONOMOUS_TRANSACTION; -- 關鍵宣告
BEGIN
INSERT INTO errorlog (errorlog_id, num1, num2, num3, text1, text2, text3)
VALUES (errorlog_seq.NEXTVAL, n1, n2, n3, t1, t2, t3);
COMMIT; -- 僅提交自治事務
END;
/
UPDATE/DELETE 某表)。log_error 寫入診斷資訊。ROLLBACK。errorlog 表——日誌依然完整保留。善用自治事務,讓錯誤日誌成為系統穩定運行的「黑盒記錄儀」,為故障快速定位提供堅實保障。