關於SAVEPOINT和自定義異常使用的一點看法

bq_wang發表於2008-01-11
關於SAVEPOINT和自定義異常使用的一點經歷

前兩天有同事問怎麼樣才能控制儲存過程中的回滾和提交,以及如果某個環節發生錯誤之後怎麼樣退出該儲存過程,想了兩天才算是有點小眉目了。
Rollback to savepoint;回滾之前所有做過的事情但不包括塊和其他savepoint裡面的事務
SavePoint 應該是個單獨的事務點,他的失敗不影響其他事務
Commit 能夠提交之前所有的操作

Create table
CREATE TABLE TEST
(

testID
NUMBER(20) not null,


testName VARCHAR2(20)

);
-- Create/Recreate primary, unique and foreign key constraints
ALTER TABLE TEST

ADD CONSTRAINT testprimaryKey PRIMARY KEY (testID);


-- Created on 2008-1-10 by bq_wang
DECLARE

-- Local variables here


exitProc
EXCEPTION;

BEGIN

-- Test statements here


DELETE FROM test;


COMMIT;


SAVEPOINT b;
--


INSERT INTO test VALUES(4,'d');


COMMIT WORK; --
僅控制b之前的事務


BEGIN


SAVEPOINT a;


INSERT INTO test VALUES(1,'a');


INSERT INTO test VALUES(2,'b');


UPDATE test SET testID=1 WHERE testID=2;


COMMIT WORK;


EXCEPTION


WHEN OTHERS THEN


ROLLBACK TO SAVEPOINT a;
--
如果有問題則回滾savepoint a的事務,不影響savepoint b


RAISE exitProc;
--
直接跳到儲存過程最後,如果遮蔽仍可以處理之後的事務


END;


SAVEPOINT c;
--
控制以下事務,如果遮蔽,則由最後的commit完成bc的提交


INSERT INTO test VALUES(5,'e');


COMMIT WORK;

EXCEPTION

WHEN exitProc THEN


ROLLBACK;


DBMS_OUTPUT.PUT_LINE('end');

END;



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-134191/,如需轉載,請註明出處,否則將追究法律責任。

相關文章