#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