yangtingkun
===========================================================
小议自治事务(二)
===========================================================

这两天看了11g的CONCEPT文档的事务部分,发现自治事务还有一些以前没有注意到的地方,这里简单总结一下。

这一篇描述自治事务的事务性特点。

小议自治事务(一):http://yangtingkun.itpub.net/post/468/467765


自治事务实现的功能是自治事务的提交或回滚不影响当前的事务。同时自治事务也是看不到当前会话所做的未提交的修改的。

SQL> TRUNCATE TABLE T_AUTO_TRANS;

表被截断。

SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
2 BEGIN
3 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
4 FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
5 DBMS_OUTPUT.PUT_LINE('P_TEST:' || I.CNT);
6 END LOOP;
7 END;
8 /

过程已创建。

SQL> CREATE OR REPLACE PROCEDURE P_TEST_AUTO AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
5 FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
6 DBMS_OUTPUT.PUT_LINE('P_TEST_AUTO:' || I.CNT);
7 END LOOP;
8 COMMIT;
9 END;
10 /

过程已创建。

SQL> INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');

已创建 1 行。

SQL> SET SERVEROUT ON
SQL> EXEC P_TEST
P_TEST:2

PL/SQL 过程已成功完成。

SQL> EXEC P_TEST_AUTO
P_TEST_AUTO:1

PL/SQL 过程已成功完成。

可以看到,对于自治事务是看不到当前会话所作的未提交的修改的。

SQL> EXEC P_TEST
P_TEST:4

PL/SQL 过程已成功完成。

而对于当前会话,由于自治事务的操作已经提交,因此之后的查询是可以看到自治事务所进行的修改的。

自治事务看不到当前会话的修改,那么自治事务调用的过程是否能看到自治事务的修改呢:

SQL> TRUNCATE TABLE T_AUTO_TRANS;

表被截断。

SQL> CREATE OR REPLACE PROCEDURE P_AUTO_TRANS AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');
5 INSERT INTO T_AUTO_TRANS VALUES (2, 'TEST');
6 FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
7 DBMS_OUTPUT.PUT_LINE('P_AUTO_TRANS:' || I.CNT);
8 END LOOP;
9 P_TEST;
10 P_TEST_AUTO;
11 COMMIT;
12 END;
13 /

过程已创建。

SQL> INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');

已创建 1 行。

SQL> EXEC P_AUTO_TRANS
P_AUTO_TRANS:2
P_TEST:3
P_TEST_AUTO:1

PL/SQL 过程已成功完成。

建立一个自治事务,分别调用一个普通过程和一个声明了自治事务的过程,结果可以看到,自治事务调用普通过程,可以看到自治事务所进行的修改,而对于自治事务调用的自治事务过程,是看不到自治事务所进行的修改的。

从这一点看,自治事务更像是在单独的会话中执行,它的事务状态不会影响当前的事务,它也不会看到当前事务没有提交的修改。

yangtingkun 发表于:2008.07.31 23:18 ::分类: ( ORACLE ) ::阅读:(558次) :: 评论 (1)
re: 小议自治事务(二) [回复]

可能我的描述不是很清楚吧。

对于一个普通的过程的调用,过程中是可以看到当前会话还没有提交的修改的。
对于一个自治事务过程的调用,过程中看不到当前会话还没有提交的修改。

当调用一个自治事务的时候,这个自治事务所调用的非自治事务存储过程,是可以看到当前自治事务的未提交修改的。
而这个自治事务所调用的自治事务存储过程是看不到当前自治事务未提交修改的。

上面是我想要表达的,其实如果仔细规整一下,发现确实和concept上概括的一样。

yangtingkun 评论于: 2008.08.04 13:31

发表评论
标题

在此添加评论
表情符号: smile laughing tongue angry crying sad wassat wink

称呼

邮箱地址(可选)

个人主页(可选)

 authimage


切换风格
新闻聚合
博客日历
文章归档...
最新发表...
最新评论...
最多阅读文章...
最多评论文章...
博客统计...
Blog信息
网站链接...