oracle事务_笔记8:自治事务如何工作
自治事务如何工作
要展示自治事务的动作和结果,最好的办法是通过例子来说明。
scott@ORCL>create table t(msg varchar2(25));
Table created.
接下来创建两个过程,每个过程只是将其名字插入到消息表中,然后提交。不过,其中一个过程是正常的过程,另一个编写为自治事务。
首先是AUTONOMOUS_INSERT过程:
scott@ORCL>create or replace procedure autonomous_insert
2 as
3 pragma autonomous_transaction;
4 begin
5 insert into t values('autonomous insert');
6 commit;
7 end;
8 /
Procedure created.
这里使用了pragma AUTONOMOUS_TRANSACTION。这个指令告诉数据库:执行这个过程时要作为一个新的自治事务来执行,而且独立于其父事务。
以下是"正常"的NOAUTONOMOUS_INSERT过程
scott@ORCL>create or replace procedure NonAutonomous_Insert
2 as
3 begin
4 insert into t values ('NonAutonomous Insert');
5 commit;
6 end;
7 /
Procedure created.
下面来观察PL/SQL代码匿名块中非自治(nonautonomous)事务的行为:
scott@ORCL>begin
2 insert into t values('Anonymous Block');
3 NonAutonomous_Insert;
4 rollback;
5 end;
6 /
PL/SQL procedure successfully completed.
scott@ORCL>select * from t;
MSG
---------------------------------------------------------------------------
Anonymous Block
NonAutonomous Insert
可以看到,匿名块执行的工作(INSERT)由NONAUTONOMOUS_INSERT过程提交。两个数据行都已提交,所以ROLLBACK命令没有什么可以回滚。
scott@ORCL>delete from t;
2 rows deleted.
scott@ORCL>commit;
Commit complete.
scott@ORCL>begin
2 insert into t values('Anonymous Block');
3 autonomous_insert;
4 rollback;
5 end;
6 /
PL/SQL procedure successfully completed.
scott@ORCL>select * from t;
MSG
---------------------------------------------------------------------------
autonomous insert
在此,只有自治事务中完成并已提交的工作会持久保留。匿名块中完成的INSERT由第4行的ROLLBACK语句回滚。自治事务过程的COMMIT对匿名块中开始的父事务没有影响。本质上讲,这就抓住了自治事务的精髓,并能从中了解到自治事务做什么。
总结一下,如果在一个“正常”的过程中COMMIT,它不仅会持久保留自己的工作,也会使该会话中未完成的工作成为永久性的。不过,如果在一个自治事务过程中完成COMMIT,只会让这个过程本身的工作成为永久性的。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5246.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
