自治事务实现的功能是自治事务的提交或回滚不影响当前的事务同时自治事务也是看不到当前会话所做的未提交的修改的
SQL>TRUNCATETABLET_AUTO_TRANS;
表被截断
SQL>CREATEORREPLACEPROCEDUREP_TESTAS
BEGIN
INSERTINTOT_AUTO_TRANSVALUES(TEST);
FORIIN(SELECTCOUNT(*)CNTFROMT_AUTO_TRANS)LOOP
DBMS_OUTPUTPUT_LINE(P_TEST:||ICNT);
ENDLOOP;
END;
/
过程已创建
SQL>CREATEORREPLACEPROCEDUREP_TEST_AUTOAS
PRAGMAAUTONOMOUS_TRANSACTION;
BEGIN
INSERTINTOT_AUTO_TRANSVALUES(TEST);
FORIIN(SELECTCOUNT(*)CNTFROMT_AUTO_TRANS)LOOP
DBMS_OUTPUTPUT_LINE(P_TEST_AUTO:||ICNT);
ENDLOOP;
COMMIT;
END;
/
过程已创建
SQL>INSERTINTOT_AUTO_TRANSVALUES(TEST);
已创建 行
SQL>SETSERVEROUTON
SQL>EXECP_TEST
P_TEST:
PL/SQL 过程已成功完成
SQL>EXECP_TEST_AUTO
P_TEST_AUTO:
PL/SQL 过程已成功完成
可以看到对于自治事务是看不到当前会话所作的未提交的修改的
SQL>EXECP_TEST
P_TEST:
PL/SQL 过程已成功完成
而对于当前会话由于自治事务的操作已经提交因此之后的查询是可以看到自治事务所进行的修改的
自治事务看不到当前会话的修改那么自治事务调用的过程是否能看到自治事务的修改呢
SQL>TRUNCATETABLET_AUTO_TRANS;
表被截断
SQL>CREATEORREPLACEPROCEDUREP_AUTO_TRANSAS
PRAGMAAUTONOMOUS_TRANSACTION;
BEGIN
INSERTINTOT_AUTO_TRANSVALUES(TEST);
INSERTINTOT_AUTO_TRANSVALUES(TEST);
FORIIN(SELECTCOUNT(*)CNTFROMT_AUTO_TRANS)LOOP
DBMS_OUTPUTPUT_LINE(P_AUTO_TRANS:||ICNT);
ENDLOOP;
P_TEST;
P_TEST_AUTO;
COMMIT;
END;
过程已创建
SQL>INSERTINTOT_AUTO_TRANSVALUES(TEST);
已创建 行
SQL>EXECP_AUTO_TRANS
P_AUTO_TRANS:
P_TEST:
P_TEST_AUTO:
PL/SQL
过程已成功完成
建立一个自治事务分别调用一个普通过程和一个声明了自治事务的过程结果可以看到自治事务调用普通过程可以看到自治事务所进行的修改而对于自治事务调用的自治事务过程是看不到自治事务所进行的修改的
从这一点看自治事务更像是在单独的会话中执行它的事务状态不会影响当前的事务它也不会看到当前事务没有提交的修改