ORACLE自治事務是一個不錯的功能,關鍵字是AUTONOMOUS_TRANSACTION,下面是我試用:
1、測試:
創建一個測試表:
CREATE TABLE TBL_TEST(
TEST_ID NUMBER NOT NULL,
TEST_DESC VARCHAR2(100) NOT NULL
);
新增兩條記錄(注意沒有進行提交):
INSERT INTO TBL_TEST VALUES(1,'DESC 1');
INSERT INTO TBL_TEST VALUES(2,'DESC 2');
通過自治事務添加6兩條記錄:
DECLARE PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
FOR i IN 3..8 LOOP
INSERT INTO TBL_TEST VALUES(i,'DESC '||i);
END LOOP;
COMMIT;
END;
/
查看執行結果如下:
SQL> SELECT * FROM TBL_TEST;
TEST_ID TEST_DESC
---------- --------------------------------------------------------------------------------
1 DESC 1
2 DESC 2
3 DESC 3
4 DESC 4
5 DESC 5
6 DESC 6
7 DESC 7
8 DESC 8
8 rows selected
回滾后再次查看結果(通過結果可以看到采用自治事務的新增沒有被回滾掉):
SQL> ROLLBACK;
Rollback complete
SQL> SELECT * FROM TBL_TEST;
TEST_ID TEST_DESC
---------- --------------------------------------------------------------------------------
3 DESC 3
4 DESC 4
5 DESC 5
6 DESC 6
7 DESC 7
8 DESC 8
6 rows selected
2、應用自治事務實現日志記錄:
創建一個日志表:
CREATE TABLE TBL_LOG(
LOG_ID NUMBER(10) PRIMARY KEY,
LOG_MSG VARCHAR2(4000) NOT NULL,
LOG_TIME DATE NOT NULL
);
創建一個序列:
CREATE SEQUENCE SEQ_TBL_LOG;
創建一個記錄日志的存儲過程:
CREATE OR REPLACE PROCEDURE DO_LOG(P_MSG IN VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO TBL_LOG VALUES(SEQ_TBL_LOG.NEXTVAL,P_MSG,SYSDATE);
COMMIT;
END;
/
測試上面的存儲過程:
BEGIN
INSERT INTO TBL_TEST VALUES (100,'DESC 100');
-- test the do_log
INSERT INTO TBL_TEST VALUES (101,NULL);
EXCEPTION
WHEN OTHERS THEN
DO_LOG(P_MSG =>SQLERRM);
ROLLBACK;
END;
/
查看運行結果:
SQL> SELECT * FROM TBL_TEST WHERE TEST_ID>=100;
TEST_ID TEST_DESC
---------- --------------------------------------------------------------------------------
SQL> SELECT * FROM TBL_LOG;
LOG_ID LOG_MSG LOG_TIME
----------- -------------------------------------------------------------------------------- -----------
1 ORA-01400: 無法將 NULL 插入 ("FWMS4ZH_TEST"."TBL_TEST"."TEST_DESC") 2009-5-15 2