数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

小议Oracle11g的自治事务(二)


发布日期:2021年09月19日
 
小议Oracle11g的自治事务(二)

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

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

过程已成功完成

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

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

上一篇:Oracle数据库托管型CRM14版一年内推出

下一篇:Oracle内部函数调用追蹤器