Oracle 11g R2 Windows 2008 R2 データベースで DBMS_AQ.deQueue に問題があります。セッションがデキューを実行し、その後 (コミットまたはロールバックの前に) セッションが強制終了されると、特定のメッセージがキューから完全に削除されます。まだキューにあるか、少なくとも例外キューにあると思います。次の手順を実行してテストします。
- セッション 1 からエンキューし、コミットします。(以下のコードを参照)
- セッション 2 からデキューします (以下のコードを参照)。
- セッション 1: MY_Q_T から * を選択 -> 私のメッセージはまだここに表示されています。
- セッション 2: MY_Q_T から * を選択 -> メッセージが表示されなくなりました。
- セッション 2 (デキュー) セッションを終了します。
- セッション 1: MY_Q_T から * を選択 -> メッセージが表示されなくなりました。メッセージが失われます。
これはバグですか?デキュー (/visibility) は自律的に設定されていないため、セッション 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;