Oracle高级消息队列(AQ)自动订阅通知CALLBACK时死锁不出队列问题总结

本文探讨了Oracle高级消息队列(AQ)自动订阅通知CALLBACK时出现的死锁问题,详细介绍了导致队列无法正常出队的原因及解决办法,包括如何通过调整参数避免死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle高级消息队列(AQ)自动订阅通知CALLBACK时死锁不出队列问题

参考:

https://blog.csdn.net/indexman/article/details/43497933

https://blog.csdn.net/cymm_liu/article/details/47149101

可以看到sys用户有demo_queue_callback_procedure的锁,造成队列不能出库。kill到吧。

队列出队是并发执行的,oracle调度队列的速度很快,注意多线程的安全性。反正我使用Count(*)判断数据是否存在还是没用。

CREATE PROCEDURE demo_queue_callback_procedure(
                 context  RAW,
                 reginfo  SYS.AQ$_REG_INFO,
                 descr    SYS.AQ$_DESCRIPTOR,
                 payload  RAW,
                 payloadl NUMBER
                 ) AS
   r_dequeue_options    DBMS_AQ.DEQUEUE_OPTIONS_T;
   r_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
   v_message_handle     RAW(16);
   o_payload            demo_queue_payload_type;
BEGIN
   r_dequeue_options.msgid := descr.msg_id;
   r_dequeue_options.consumer_name := descr.consumer_name;

 r_dequeue_options.wait := dbms_aq.no_wait;//这个是关键

   DBMS_AQ.DEQUEUE(
      queue_name         => descr.queue_name,
      dequeue_options    => r_dequeue_options,
      message_properties => r_message_properties,
      payload            => o_payload,
      msgid              => v_message_handle
      );

   INSERT INTO demo_queue_message_table ( message )
   VALUES ( 'Message [' || o_payload.message || '] ' ||
            'dequeued at [' || TO_CHAR( SYSTIMESTAMP,
                                        'DD-MON-YYYY HH24:MI:SS.FF3' ) || ']' );
END;

/


(1)wait的两个值forever和no_wait是指如果当前队列中无消息时,是否进行等待,默认等待。

(2) navigation的两个值first_message和next_message,一般出于性能考虑我们使用后者,或者在第一次出队时使用前者而在随后的出队中使用后者:


如果Oracle高级队列不能自动出队,一要考虑死锁,如果数据不重要可以删除队列表数据,使用AQ的包删除,不是直接删除队列表的数据。另一种方式是把订阅者删除了。不出队可以重启Oracle可以解决。

因为Oracle会实时调度demo_queue_callback_procedure,所以会造成demo_queue_callback_procedure编译时会死锁,特别是调用了其他的过程,造成demo_queue_callback_procedure失效,自动编译要死锁的。使用动态语句调用其他存储过程可以解决此问题。

队列超期后也不能自动出队,只有手动出队了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值