根据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;
当我从非自治程序调用自治程序时,它们并行执行,但实际上它们应该按给定的顺序执行。
我错过了什么吗?有没有办法解决这个问题?
答案 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 的例子证明了这一点