自治事务范围和错误引发
Posted
技术标签:
【中文标题】自治事务范围和错误引发【英文标题】:autonomous transaction scope and error raising 【发布时间】:2012-08-28 13:38:44 【问题描述】:我有点怀疑。让我们假设这个包的过程:
PROCEDURE ERR_MANAGER(I_ERRM IN VARCHAR2) IS
BEGIN
ROLLBACK;
--DO SOME STUFF
END ERR_MANAGER;
PROCEDURE test IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
test2;
COMMIT;
EXCEPTION WHEN OTHERS THEN ERR_MANAGER(SQLERRM);
END test;
PROCEDURE test2 IS
BEGIN
--DO SOME TRANSACTIONNAL DML
RAISE_APPLICATION_ERROR(-20001, 'ERR'); --for the test purpose, in reality this could be any actual error
END test2;
所以,如您所见,test2()
中有一个错误,该错误将上升到test()
,然后在err_manager()
方法中进行处理。
所以我有两个问题:
-
err_manager() 的作用域是什么?是否还在自治事务内?我想是的,因为它只是一个函数调用,但我想确定
如果您因为错误提升到更高级别而粗暴地退出自治事务,而不进行任何类型的提交或回滚,会发生什么?
非常感谢。 S.
【问题讨论】:
【参考方案1】:err_manager
过程执行的事务范围是调用自治事务,你是对的。
过程和函数继承它们的调用事务,除非它们本身是自治事务。
当自治事务引发未处理的错误时,它会回滚其更改并将错误传播到调用应用程序。这是一个测试:
SQL> CREATE TABLE t (id number);
Table created.
SQL> DECLARE
2 l NUMBER;
3 PROCEDURE p IS
4 pragma autonomous_transaction;
5 BEGIN
6 insert into t values (1);
7 raise_application_error(-20001, 'rollback?');
8 END;
9 BEGIN
10 p;
11 EXCEPTION
12 WHEN OTHERS THEN
13 DBMS_OUTPUT.put_line('error catched:' || sqlcode);
14 SELECT COUNT(*) INTO l FROM t;
15 DBMS_OUTPUT.put_line('lines in t: ' || l);
16 END;
17 /
error catched:-20001
lines in t: 0
PL/SQL procedure successfully completed.
【讨论】:
以上是关于自治事务范围和错误引发的主要内容,如果未能解决你的问题,请参考以下文章