transactions - 自治事务范围和错误引发

标签 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(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。

    最佳答案

  • 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.
    
  • 关于transactions - 自治事务范围和错误引发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12160503/

    相关文章:

    python - 为什么start_transaction不设置事务隔离级别?

    mysql - SQL,如何测试并发事务

    oracle - 在包体内调用私有(private)函数

    sql - 在插入第三个表之前,如何使用触发器从两个表中获取日期?

    oracle - PL/SQL异常处理-函数返回无值

    python - NDB 交易中的错误?

    transactions - 启动日志 "No Transaction manager found"

    java - 如何限制动态查询只接受 select 语句?

    java - 使用java将csv文件导入oracle数据库

    .net - 使用 Microsoft ODBC for Oracle 连接到 Oracle 10g 数据库