0

美好的一天,各自的!

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

在我的出队过程中,我不在主事务中进行任何提交。相反,我处理消息并在自主事务中进行提交。像这样的东西:

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 之后提交,还是取决于某些条件?如果视情况而定,您能否澄清一下,在什么情况下我必须明确承诺。

在此先感谢,安德鲁。

4

1 回答 1

0

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

自治事务正在消除许多将要完成的隐式处理。我会完全废弃它,然后如果您的程序成功完成,则该消息将立即标记为已处理。

于 2021-01-15T12:29:03.173 回答