自治交易擁有獨立的 COMMIT/ROLLBACK 範圍,其結果不影響呼叫端的未提交變更;反之,呼叫端的提交/回滾也不影響自治交易已完成的變更。呼叫會話會暫停直到自治程序返回控制權——這不是平行執行機制。
在 CREATE PROCEDURE 中指定 AUTONOMOUS 關鍵字:
CREATE OR REPLACE PROCEDURE your_proc_name()
LANGUAGE SQL
AUTONOMOUS
BEGIN
-- 自治工作
END;
執行時會在獨立會話中運行:成功隱式提交、失敗回滾,皆不影響呼叫端交易。
銀行要求每次查詢客戶敏感資料必須記錄:查詢員工 ID、客戶帳號、時間戳。介面以預存程序實作。
DROP TABLE customerSensitiveInfo;
CREATE TABLE customerSensitiveInfo (customerAccountNumber INT, amountOverdue INT);
DROP TABLE log_table;
CREATE TABLE log_table (
queryingEmployeeID VARCHAR(100),
customerAccNumber INT,
when TIMESTAMP
);
COMMIT;
CREATE OR REPLACE PROCEDURE log_query (
IN queryingEmployee VARCHAR(100),
IN accNumber INT,
IN when TIMESTAMP
)
LANGUAGE SQL
BEGIN
INSERT INTO log_table VALUES (queryingEmployee, accNumber, when);
END;
COMMIT;
CREATE OR REPLACE PROCEDURE get_AmountOverdue (
IN accountNumber INT,
OUT overdue INT
)
LANGUAGE SQL
BEGIN
DECLARE due INT;
DECLARE currentTime TIMESTAMP;
SET currentTime = CURRENT TIMESTAMP;
CALL log_query(CURRENT USER, accountNumber, currentTime);
SELECT amountOverdue INTO due FROM customerSensitiveInfo
WHERE customerAccountNumber = accountNumber;
SET overdue = due;
END;
COMMIT;
INSERT INTO customerSensitiveInfo VALUES (12345, 10000), (12346, 20000);
COMMIT;
-- 呼叫並立即回滾
CALL get_AmountOverdue(12345, ?);
ROLLBACK;
-- 檢查 log_table
SELECT * FROM log_table; -- 0 筆,因整個交易被回滾
CREATE OR REPLACE PROCEDURE log_query (
IN queryingEmployee VARCHAR(100),
IN accNumber INT,
IN when TIMESTAMP
)
LANGUAGE SQL
AUTONOMOUS
BEGIN
INSERT INTO log_table VALUES (queryingEmployee, accNumber, when);
END;
COMMIT;
CALL get_AmountOverdue(12345, ?);
ROLLBACK;
SELECT * FROM log_table;
-- 現在有 1 筆記錄!即使外層交易回滾,自治記錄已獨立提交
AUTONOMOUS 只能用於 LANGUAGE SQL 的預存程序