小议Oracle 11g的自治事务(二)
2008-08-09 12:42:46 来源:WEB开发网自治事务实现的功能是自治事务的提交或回滚不影响当前的事务。同时自治事务也是看不到当前会话所做的未提交的修改的。
SQL>TRUNCATETABLET_AUTO_TRANS;
表被截断。
SQL>CREATEORREPLACEPROCEDUREP_TESTAS
2BEGIN
3INSERTINTOT_AUTO_TRANSVALUES(2,'TEST');
4FORIIN(SELECTCOUNT(*)CNTFROMT_AUTO_TRANS)LOOP
5DBMS_OUTPUT.PUT_LINE('P_TEST:'||I.CNT);
6ENDLOOP;
7END;
8/
过程已创建。
SQL>CREATEORREPLACEPROCEDUREP_TEST_AUTOAS
2PRAGMAAUTONOMOUS_TRANSACTION;
3BEGIN
4INSERTINTOT_AUTO_TRANSVALUES(2,'TEST');
5FORIIN(SELECTCOUNT(*)CNTFROMT_AUTO_TRANS)LOOP
6DBMS_OUTPUT.PUT_LINE('P_TEST_AUTO:'||I.CNT);
7ENDLOOP;
8COMMIT;
9END;
10/
过程已创建。
SQL>INSERTINTOT_AUTO_TRANSVALUES(1,'TEST');
已创建 1 行。
SQL>SETSERVEROUTON
SQL>EXECP_TEST
P_TEST:2
PL/SQL 过程已成功完成。
SQL>EXECP_TEST_AUTO
P_TEST_AUTO:1
PL/SQL 过程已成功完成。
可以看到,对于自治事务是看不到当前会话所作的未提交的修改的。
SQL>EXECP_TEST
P_TEST:4
PL/SQL 过程已成功完成。
而对于当前会话,由于自治事务的操作已经提交,因此之后的查询是可以看到自治事务所进行的修改的。
自治事务看不到当前会话的修改,那么自治事务调用的过程是否能看到自治事务的修改呢:
SQL>TRUNCATETABLET_AUTO_TRANS;
表被截断。
SQL>CREATEORREPLACEPROCEDUREP_AUTO_TRANSAS
2PRAGMAAUTONOMOUS_TRANSACTION;
3BEGIN
4INSERTINTOT_AUTO_TRANSVALUES(1,'TEST');
5INSERTINTOT_AUTO_TRANSVALUES(2,'TEST');
6FORIIN(SELECTCOUNT(*)CNTFROMT_AUTO_TRANS)LOOP
7DBMS_OUTPUT.PUT_LINE('P_AUTO_TRANS:'||I.CNT);
8ENDLOOP;
9P_TEST;
10P_TEST_AUTO;
11COMMIT;
12END;
过程已创建。
SQL>INSERTINTOT_AUTO_TRANSVALUES(1,'TEST');
已创建 1 行。
SQL>EXECP_AUTO_TRANS
P_AUTO_TRANS:2
P_TEST:3
P_TEST_AUTO:1
PL/SQL
过程已成功完成。
建立一个自治事务,分别调用一个普通过程和一个声明了自治事务的过程,结果可以看到,自治事务调用普通过程,可以看到自治事务所进行的修改,而对于自治事务调用的自治事务过程,是看不到自治事务所进行的修改的。
从这一点看,自治事务更像是在单独的会话中执行,它的事务状态不会影响当前的事务,它也不会看到当前事务没有提交的修改。
- ››oracle 恢复误删除的表和误更新的表
- ››Oracle分页查询排序数据重复问题
- ››Oracle创建dblink报错:ORA-01017、ORA-02063解决
- ››Oracle 提高SQL执行效率的方法
- ››Oracle 动态查询,EXECUTE IMMEDIATE select into...
- ››Oracle 11g必须开启的服务及服务详细介绍
- ››oracle性能34条优化技巧
- ››oracle数据库生成随机数的函数
- ››Oracle 数据库表空间容量调整脚本
- ››oracle单库彻底删除干净的方法
- ››Oracle创建表空间、创建用户以及授权、查看权限
- ››oracle 中 UPDATE nowait 的使用方法
更多精彩
赞助商链接