Transactions 自治事务范围和错误引发

Transactions 自治事务范围和错误引发,transactions,plsql,oracle10g,Transactions,Plsql,Oracle10g,我有点怀疑。让我们假设这个包的程序: 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(SQLER

我有点怀疑。让我们假设这个包的程序:

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\u manager()
方法中处理

所以我有两个问题:

  • err_manager()的范围是什么?它仍然在自治事务中吗?我想是的,因为这只是一个函数调用,但我想确定一下
  • 如果由于错误升级到更高级别而粗暴地退出自治事务,而不进行任何类型的提交或回滚,会发生什么情况
  • 多谢各位。 美国

  • 执行
    err\u 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.