根据this的说法,自治事务应该挂起它的调用事务,但它的功能并不像oracle文档中描述的那样,相反,独立事务独立执行,这意味着并行执行。这就是我的情况。我有几个过程的包,其中一个是用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;当我从非自治过程调用自治过程时,它们是并行执行的,但实际上它们应该按给定的顺序执行。
我是不是遗漏了什么?有没有办法解决这个问题?
发布于 2014-10-02 18:51:52
我的测试与你的断言不一致:
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中的休眠之前提交。我在包中的过程中重复了这一点,同样的事情也发生了。insert from test2始终发生在insert from test1之前。
发布于 2021-05-06 15:28:39
我只是偶然发现了这一点,所以我晚了六年:),但甲骨文文档(https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/autotransaction_pragma.htm#LNPLS01302)明确指出:
当调用自主例程时,挂起主事务被挂起。自治事务完全独立于主事务:它们不共享任何锁、资源或提交依赖关系。自主事务不影响主事务。
Alex Poole举例说明了这一点
https://stackoverflow.com/questions/26158666
复制相似问题