Oracle自治事务读书笔记

                                 

 

         Oracle自治事务(Autonomous Transaction)将一个主事务分割成几个子事务,在执行完子事务以后再继续主事务。这里的关键是,子事务是独立于主事务的,子事务中的Rollback和Commit操作只会影响子事务中的DML操作;同样,主事务中的Rollback和Commit操作只会影响事务中的DML操作,而不会影响子事务中的操作。在子事务中已经commit的操作,不会被主事务中的rollback撤销。

          制定PL/SQL程序块为自治事务可以通过在程序开头使用如下命令实现

          PRAGMA AUTONOMOUS_TRANSACTION
 

          定义自治事务必须遵循以下规则:         

  • 如果要被定义为自治事务的程序是匿名的,则它必须是一个最外层的程序块。

  • 如果不是匿名的,则它必须是函数或者过程,或者是包含在一个中。在一个包中,只有其中的函数或过程能够定义成自治事务。整个包不能申明为自治事务。

  • 一个对象的方法可以申明为自治事务

  • 触发器可以申明为自治事务

  • 内嵌程序块不能申明为自治事务

注意:对于一个匿名的自治事务程序块来说,只有这个块的begin和end之间的代码被看作是自治事务。考虑下面的例子

  1  DECLARE
  2    PRAGMA AUTONOMOUS_TRANSACTION;
  3    FUNCTION dummy_log_error RETURN NUMBER;
  4    v_num NUMBER(1) := 0;
  5    retcd NUMBER := dummy_log_error;
  6    FUNCTION dummy_log_error RETURN NUMBER
  7        IS
  8    BEGIN
  9      INSERT INTO error_log VALUES ( -99,-99,'Dummy Error!',USER, SYSDATE);
 10      RETURN (-99);
 11   END;
 12  BEGIN
 13      INSERT INTO error_log VALUES (v_num, v_num, 'No Error!',USER, SYSDATE);
 14      COMMIT;
 15  END;

Oracle认为自治事务从12行开始,到15行结束。在执行上述代码之后,可以看到error_log表中存在上面代码插入的两条记录,但执行rollback之后,只剩下13行插入的记录,而函数dummy_log_error()插入的记录被回退掉了。这就证明了前面所说的关于自治事务范围的表述。

  http://stanli.bokee.com/6132745.html

你可能感兴趣的:(Oracle自治事务读书笔记)