自治事务实现的功能是自治事务的提交或回滚不影响当前的事务。同时自治事务也是看不到当前会话所做的未提交的修改的。
| 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 过程已成功完成。
可以看到,对于自治事务是看不到当前会话所作的未提交的修改的。

