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 から * を選択 -> メッセージが表示されなくなりました。メッセージが失われます。

これはバグですか?デキュー (/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;
4

1 に答える 1

0

どのようにセッションを殺していますか? クライアントプログラムのセッションで開いているトランザクションをコミットするようにデフォルト設定されているセッションからログオフしているようです。また、デキュー トランザクションがコミットされるため、メッセージはキューから削除されます。

テーブルに行を挿入し、セッションを強制終了/閉じて、行が追加されたかどうかを確認することで、これを確認できます。

于 2011-08-03T12:58:30.227 に答える