在队列被杀后,Oracle AQ消息丢失,而队列正在进行中

时间:2011-07-20 16:34:41

标签: database oracle message-queue advanced-queuing

我在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中选择* - >我的信息不再可见了。消息丢失了。
  7. 这是一个错误吗?由于dequeue(/ visibility)未设置为自治,因此当会话2被终止时,我希望消息仍然在队列中。任何解决方法的想法?

    用于入队和出列的代码:

    ENQUEUE

    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;
    

    DEQUEUE

    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;
    

1 个答案:

答案 0 :(得分:0)

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

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