Сообщение Oracle AQ потеряно после прекращения сеанса во время удаления из очереди - PullRequest
1 голос
/ 20 июля 2011

У меня проблема с DBMS_AQ.deQueue в базе данных Oracle 11g R2 Windows 2008 R2. Когда сеанс выполняет удаление из очереди и после этого он прерывается (до фиксации или отката), конкретное сообщение навсегда удаляется из очереди. Я ожидал бы, что это все еще будет в очереди, или по крайней мере будет в очереди исключений. Я выполняю следующие шаги для проверки:

  1. Поставьте в очередь сессию 1 и подтвердите. (см. код ниже)
  2. Отказ от сеанса 2. (см. Код ниже)
  3. Сессия 1: выберите * из MY_Q_T -> мое сообщение все еще отображается здесь.
  4. Сессия 2: выберите * из MY_Q_T -> мое сообщение больше не отображается.
  5. Kill Session 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;

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 голосов
/ 03 августа 2011

Как вы убиваете сеанс?Похоже, вы просто выходите из сеанса, который по умолчанию фиксирует любые открытые транзакции в сеансе в вашей клиентской программе.А так как транзакция очереди завершена, сообщение исчезло из очереди.

Вы можете проверить это, вставив строку в таблицу, убив / закрыв сеанс и проверив, добавлена ​​ли строка.

...