熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

小議Oracle11g的自治事務(二)

2013-11-13 22:16:41  來源: Oracle 

  自治事務實現的功能是自治事務的提交或回滾不影響當前的事務同時自治事務也是看不到當前會話所做的未提交的修改的 

   SQL> TRUNCATE TABLE T_AUTO_TRANS;

  表被截斷

   SQL> CREATE OR REPLACE PROCEDURE P_TEST AS
   BEGIN
   INSERT INTO T_AUTO_TRANS VALUES ( TEST);
   FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
   DBMS_OUTPUTPUT_LINE(P_TEST: || ICNT);
   END LOOP;
   END;
   /

  過程已創建 

   SQL> CREATE OR REPLACE PROCEDURE P_TEST_AUTO AS
   PRAGMA AUTONOMOUS_TRANSACTION;
   BEGIN
   INSERT INTO T_AUTO_TRANS VALUES ( TEST);
   FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
   DBMS_OUTPUTPUT_LINE(P_TEST_AUTO: || ICNT);
   END LOOP;
   COMMIT;
   END;
   /

  過程已創建

   SQL> INSERT INTO T_AUTO_TRANS VALUES ( TEST);

  已創建  

   SQL> SET SERVEROUT ON
  SQL> EXEC P_TEST
  P_TEST:

  PL/SQL 過程已成功完成

   SQL> EXEC P_TEST_AUTO
  P_TEST_AUTO:

  PL/SQL 過程已成功完成

  可以看到對於自治事務是看不到當前會話所作的未提交的修改的

   SQL> EXEC P_TEST
  P_TEST:

  PL/SQL 過程已成功完成

  而對於當前會話由於自治事務的操作已經提交因此之後的查詢是可以看到自治事務所進行的修改的

  自治事務看不到當前會話的修改那麼自治事務調用的過程是否能看到自治事務的修改呢 

   SQL> TRUNCATE TABLE T_AUTO_TRANS;

  表被截斷

   SQL> CREATE OR REPLACE PROCEDURE P_AUTO_TRANS AS
   PRAGMA AUTONOMOUS_TRANSACTION;
   BEGIN
   INSERT INTO T_AUTO_TRANS VALUES ( TEST);
   INSERT INTO T_AUTO_TRANS VALUES ( TEST);
   FOR I IN (SELECT COUNT(*) CNT FROM T_AUTO_TRANS) LOOP
   DBMS_OUTPUTPUT_LINE(P_AUTO_TRANS: || ICNT);
   END LOOP;
   P_TEST;
   P_TEST_AUTO;
   COMMIT;
   END;

  過程已創建  

   SQL> INSERT INTO T_AUTO_TRANS VALUES ( TEST);

  已創建

   SQL> EXEC P_AUTO_TRANS
  P_AUTO_TRANS:
  P_TEST:
  P_TEST_AUTO:
  PL/SQL 

  過程已成功完成

  建立一個自治事務分別調用一個普通過程和一個聲明了自治事務的過程結果可以看到自治事務調用普通過程可以看到自治事務所進行的修改而對於自治事務調用的自治事務過程是看不到自治事務所進行的修改的

  從這一點看自治事務更像是在單獨的會話中執行它的事務狀態不會影響當前的事務它也不會看到當前事務沒有提交的修改


From:http://tw.wingwit.com/Article/program/Oracle/201311/18661.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.