#PRAGMA statement

自治事务是由PL中由另一个事务(主事务)启动的独立事务。自治事务不与主事务共享锁,资源或提交依赖关系,可独立执行SQL操作并进行提交或回滚。

# 声明自治事务

声明自治事务可以在程序开头使用如下命令:PRAGMA AUTONOMOUS_TRANSACTION。声明后即开始AUTONOMOUS ROUTINE,其中可包含多个COMMIT以及ROLLBACK。

声明自治事务遵循以下规则:

  • 自治事务必须在最外层的DECLARE中的声明。
  • 自治事务不是一个嵌套的事务,其提交跟回滚操作不影响主事务。
  • 一个自治例程可包含多个自治事务。
  • 例程中与事务相关的语句最后必须显式地使用COMMIT或ROLLBACK,否则会导致报错并将语句内容回滚。
  • 自治事务执行异常或没有COMMIT/ROLLBACK的场景下会将异常进行上抛,当外层有相应的EXCEPTION时可以对异常进行处理。
  • 匿名块,过程体,触发器以及函数可以声明为自治事务,其余类型不可使用。

示例

CREATE OR replace PROCEDURE Autonomous_Insert
AS
   PRAGMA autonomous_transaction;
BEGIN
    INSERT INTO area VALUES ( '00','自治事务','Autonomous Insert' );
    INSERT INTO area VALUES ( '99','自治事务','Autonomous Insert' );
    COMMIT;
END;
/

BEGIN
    INSERT INTO area VALUES ( '98','自治事务','Commit Block' );
    Autonomous_Insert;
    ROLLBACK;
END;
/

SELECT area_no,area_name,DHQ FROM area;

--result

AREA_NO AREA_NAME                                                     DHQ
------- ------------------------------------------------------------- ---------------------
01      华东                                                          Shanghai
02      华西                                                          Chengdu
03      华南                                                          Guangzhou
04      华北                                                          Beijing
05      华中                                                          Wuhan
00      自治事务                                                      Autonomous Insert
99      自治事务                                                      Autonomous Insert


DELETE FROM area WHERE area_name='自治事务';

CREATE OR replace PROCEDURE Autonomous_Insert
AS
   PRAGMA autonomous_transaction;
BEGIN
    INSERT INTO area VALUES ( '00','自治事务','Autonomous Insert' );
END;
/

BEGIN
    INSERT INTO area VALUES ( '97','自治事务','Rollback Block' );
    Autonomous_Insert;
    ROLLBACK;
END;
/

YAS-05232 active autonomous transaction detected and rolled back
pdf-btn 下载文档
copy-btn 复制链接