我在Oracle 11g R2 Windows 2008 R2数据库上遇到DBMS_AQ.deQueue问题。当会话执行出队并在此之后(在提交或回滚之前)被终止时,特定消息将从队列中永久删除。我希望它仍然在队列中,或者至少在异常队列中。我执行以下步骤来测试:
这是一个错误吗?由于dequeue(/ visibility)未设置为自治,因此当会话2被终止时,我希望消息仍然在队列中。任何解决方法的想法?
用于入队和出列的代码:
ENQUEUE :
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;
答案 0 :(得分:0)
你是如何杀死会话的?看起来您刚刚从会话中注销,默认情况下在客户端程序中提交会话中的任何打开的事务。 并且由于提交了dequeue事务,消息将从队列中消失。
您可以通过在表中插入一行,终止/关闭会话并检查是否添加了行来验证这一点。