进入自主PL / SQL块时,不会暂停调用者的事务上下文

时间:2014-10-02 10:10:18

标签: oracle plsql transactions oracle11gr2

根据this自治事务应该暂停其调用事务,但是它没有像oracle docs中描述的那样运行,而是自主事务独立执行,这意味着并行。那是我的情况。我有几个程序包,其中一个用PRAGMA AUTONOMOUS_TRANSACTION声明,如下所示:

PROCEDURE test1
IS
BEGIN
  test2;
  INSERT INTO <mytable> VALUES(<values>);
END;

PROCEDURE test2
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO <maytable2> VALUES(<values>);
END;

当我从非自治程序调用自治程序时,它们并行执行,但实际上它们应该按给定的顺序执行。

我错过了什么吗?有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:0)

我的测试不同意你的断言:

create table t1 (id number, ts timestamp);
create table t2 (id number, ts timestamp);

CREATE OR REPLACE PROCEDURE test2
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  DBMS_LOCK.SLEEP(10);
  INSERT INTO t2 VALUES(2, systimestamp);
  COMMIT;
END;
/

CREATE OR REPLACE PROCEDURE test1
IS
BEGIN
  test2;
  INSERT INTO t1 VALUES(1, systimestamp);
END;
/

exec test1;

select * from t1;
select * from t2;

获得:

table T1 created.
table T2 created.
PROCEDURE TEST2 compiled
PROCEDURE TEST1 compiled
anonymous block completed
        ID TS                         
---------- ----------------------------
         1 02-OCT-14 11.46.54.649925000 

        ID TS                         
---------- ----------------------------
         2 02-OCT-14 11.46.54.629156000 

无论多长时间我都会睡觉(好吧,最多还是30秒)这种行为成立;即使我在test2睡觉前犯了错。我用包中的程序重复了这一点,同样的事情发生了。来自test2的插入始终在test1的插入之前发生。

答案 1 :(得分:0)

只是偶然发现了这一点,所以我迟到了六年:),但 Oracle 文档 (https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/autotransaction_pragma.htm#LNPLS01302) 明确指出:

<块引用>

当一个自治例程被调用时,主事务是 暂停。自治事务完全独立于 主事务:它们不共享锁、资源或提交 依赖关系。自治事务不影响主 交易。

和 Alex Poole 的例子证明了这一点