Oracle dbms_aq.dequeue



大家好!

环境:Windows下Oracle 18c XE 64位。我有一个简单的点对点队列。队列persitent。单一的消费者。你能告诉我:究竟在什么时候必须从队列中删除离队列的消息?

在我的排队过程中,我没有在主事务中做任何提交。相反,我在自治事务中处理消息并执行提交。像这样:

procedure deq_main
as 
 procedure proc_deq (p_payload in sometype) 
 as 
 mytype sometype;
 pragma autonomous_transaction;
 begin
  ... do some work
    commit;
 end proc_deq;
begin
  dbms_aq.dequeue(...payload=> mytype,...);
  proc_deq(mytype);
end deq_main;  

deq_main过程中没有提交dequeue进程。但是,从队列中删除消息。这是什么意思?我应该永远不要在dbms_aq.dequeue之后提交,还是取决于某些条件?如果要看情况的话,你能不能澄清一下,在什么情况下我必须明确地提交。

提前感谢,安德鲁。

您的dequeue将立即在内部将消息标记为正在进行中。您必须在该事务中提交或回滚才能完成它。当您断开会话时,您可能正在提交,否则您将回滚并将消息标记为失败(这可能会将其移动到异常队列中)。

自治事务带走了很多隐式处理。我将完全废弃它,然后如果您的过程成功完成,则消息被标记为立即处理。

相关内容

  • 没有找到相关文章

最新更新