WEB开发网
开发学院数据库Oracle 小议Oracle 11g的自治事务(二) 阅读

小议Oracle 11g的自治事务(二)

 2008-08-09 12:42:46 来源:WEB开发网   
核心提示:自治事务实现的功能是自治事务的提交或回滚不影响当前的事务,同时自治事务也是看不到当前会话所做的未提交的修改的,小议Oracle 11g的自治事务(二), SQL>TRUNCATETABLET_AUTO_TRANS;表被截断,SQL>CREATEORREPLACEPROCEDUREP_TESTAS2BEGIN

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

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

过程已成功完成。

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

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

Tags:小议 Oracle 自治

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接