1

我在 Oracle 11g R2 Windows 2008 R2 数据库上遇到 DBMS_AQ.deQueue 问题。当会话执行出队并在此之后(在提交或回滚之前)被终止时,特定消息将从队列中永久删除。我希望它仍然在队列中,或者至少在异常队列中。我执行以下步骤进行测试:

  1. 从会话 1 入队并提交。(见下面的代码)
  2. 从会话 2 中出列。(参​​见下面的代码)
  3. 会话 1:从 MY_Q_T 中选择 * -> 我的消息在这里仍然可见。
  4. 会话 2:从 MY_Q_T 中选择 * -> 我的消息不再可见。
  5. 终止会话 2(出队)会话。
  6. 会话 1:从 MY_Q_T 中选择 * -> 我的消息不再可见。消息丢失。

这是一个错误吗?由于出队(/可见性)未设置为自治,我希望在会话 2 被终止时消息仍在队列中。任何解决方法的想法?

用于入队和出队的代码:

排队

declare
    queue_options      DBMS_AQ.ENQUEUE_OPTIONS_T;
    message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
    message_id         raw(16);
    pl                 MY_PAYLPOAD_T;
begin
    DBMS_AQ.enQueue(queue_name         => 'MY_Q',
                    enqueue_options    => queue_options,
                    message_properties => message_properties,
                    payload            => pl,
                    msgid              => message_id);
end;

出队

declare
    queue_options      DBMS_AQ.DEQUEUE_OPTIONS_T;
    message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
    message_id         raw(2000);
    pl               MY_PAYLPOAD_T;
begin
    DBMS_AQ.DEQUEUE(queue_name         => 'MY_Q',
                  dequeue_options    => queue_options,
                  message_properties => message_properties,
                  payload            => pl,
                  msgid              => message_id);
end;
4

1 回答 1

0

你是如何杀死会话的?看起来您只是从会话中注销,默认情况下在您的客户端程序的会话中提交任何打开的事务。并且由于提交了出队事务,消息从队列中消失了。

您可以通过在表中插入一行、终止/关闭会话并检查是否添加了行来验证这一点。

于 2011-08-03T12:58:30.227 回答