小议Oracle11g有哪些自治事务?
由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。
但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:
SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
2 G_NUM NUMBER := 0;
3 END;
4 /
程序包已创建。
SQL> CREATE OR REPLACE PROCEDURE P_AUTO AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3...全部
由于自治事务的提交或回滚不会影响到调用自治事务的主事务,因此主事务和自治事务必然是彼此独立的事务,二者之间也不可能有任何事务级的上下文继承关系。
但是由于主事务和自治事务同属于一个会话,因此二者具有相同的会话上下文环境,比如在包变量上,二者就可以看到对方对变量进行的修改:
SQL> CREATE OR REPLACE PACKAGE PA_TEST AS
2 G_NUM NUMBER := 0;
3 END;
4 /
程序包已创建。
SQL> CREATE OR REPLACE PROCEDURE P_AUTO AS
2 PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4 INSERT INTO T_AUTO_TRANS VALUES (1, 'TEST');
5 PA_TEST。
G_NUM := PA_TEST。G_NUM + 1;
6 DBMS_OUTPUT。PUT_LINE(PA_TEST。G_NUM);
7 COMMIT;
8 END;
9 /
过程已创建。
下面分别在主事务和自治事务中修改包中变量的值:
SQL> SET SERVEROUT ON
SQL> EXEC PA_TEST。
G_NUM := PA_TEST。G_NUM + 1;
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_OUTPUT。PUT_LINE(PA_TEST。G_NUM);
1
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO
2
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO
3
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_OUTPUT。PUT_LINE(PA_TEST。
G_NUM);
4
PL/SQL 过程已成功完成。
SQL> EXEC PA_TEST。G_NUM := PA_TEST。G_NUM + 1;
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_OUTPUT。
PUT_LINE(PA_TEST。G_NUM);
5
PL/SQL 过程已成功完成。
SQL> EXEC P_AUTO
6
PL/SQL 过程已成功完成。
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> SET SERVEROUT ON
SQL> EXEC DBMS_OUTPUT。PUT_LINE(PA_TEST。G_NUM);
PL/SQL 过程已成功完成。
可以看到直到会话退出,包中的变量才重新初始化,在此之前自治事务和主事务可以同时看到彼此对变量的修改。
收起