首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进入自治PL/SQL块时,调用方的事务上下文不会挂起

进入自治PL/SQL块时,调用方的事务上下文不会挂起
EN

Stack Overflow用户
提问于 2014-10-02 18:10:18
回答 2查看 284关注 0票数 0

根据this的说法,自治事务应该挂起它的调用事务,但它的功能并不像oracle文档中描述的那样,相反,独立事务独立执行,这意味着并行执行。这就是我的情况。我有几个过程的包,其中一个是用PRAGMA AUTONOMOUS_TRANSACTION声明的,类似于:

代码语言:javascript
复制
PROCEDURE test1
IS
BEGIN
  test2;
  INSERT INTO <mytable> VALUES(<values>);
END;

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

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

我是不是遗漏了什么?有没有办法解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2014-10-02 18:51:52

我的测试与你的断言不一致:

代码语言:javascript
复制
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;

它会得到:

代码语言:javascript
复制
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之前。

票数 0
EN

Stack Overflow用户

发布于 2021-05-06 15:28:39

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

当调用自主例程时,挂起主事务被挂起。自治事务完全独立于主事务:它们不共享任何锁、资源或提交依赖关系。自主事务不影响主事务。

Alex Poole举例说明了这一点

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26158666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档