У меня проблема с DBMS_AQ.deQueue в базе данных Oracle 11g R2 Windows 2008 R2. Когда сеанс выполняет удаление из очереди и после этого он прерывается (до фиксации или отката), конкретное сообщение навсегда удаляется из очереди. Я ожидал бы, что это все еще будет в очереди, или по крайней мере будет в очереди исключений. Я выполняю следующие шаги для проверки:
- Поставьте в очередь сессию 1 и подтвердите. (см. код ниже)
- Отказ от сеанса 2. (см. Код ниже)
- Сессия 1: выберите * из MY_Q_T -> мое сообщение все еще отображается здесь.
- Сессия 2: выберите * из MY_Q_T -> мое сообщение больше не отображается.
- Kill Session 2 (очередь из очереди).
- Сессия 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;