我在 Oracle 11g R2 Windows 2008 R2 数据库上遇到 DBMS_AQ.deQueue 问题。当会话执行出队并在此之后(在提交或回滚之前)被终止时,特定消息将从队列中永久删除。我希望它仍然在队列中,或者至少在异常队列中。我执行以下步骤进行测试:
- 从会话 1 入队并提交。(见下面的代码)
- 从会话 2 中出列。(参见下面的代码)
- 会话 1:从 MY_Q_T 中选择 * -> 我的消息在这里仍然可见。
- 会话 2:从 MY_Q_T 中选择 * -> 我的消息不再可见。
- 终止会话 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;
出队:
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;