【问题标题】:Sql Service Broker and transactionSql Service Broker 和事务
【发布时间】:2012-12-20 18:28:37
【问题描述】:

MSDN 上的所有示例都将发送和接收语句放在事务中。以下脚本来自http://msdn.microsoft.com/en-US/library/bb839499(v=sql.100).aspx

问题一:为什么所有的例子都不使用begin try...end try begin catch...end catch来处理异常?

问题 2: 如果消息消费/处理需要很长时间怎么办?可以对 SSB 语句进行长期事务吗?最好的方法是什么?

问题 3: 如果消息名称不是 '//AWDB/1DBSample/RequestMessage',则以下代码不会结束对话。是bug吗?

DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
DECLARE @RecvReqMsg NVARCHAR(100);
DECLARE @RecvReqMsgName sysname;

BEGIN TRANSACTION;

WAITFOR
( RECEIVE TOP(1)
    @RecvReqDlgHandle = conversation_handle,
    @RecvReqMsg = message_body,
    @RecvReqMsgName = message_type_name
  FROM TargetQueue1DB
), TIMEOUT 1000;

-- Process.... May take a long time

IF @RecvReqMsgName =
   N'//AWDB/1DBSample/RequestMessage'
BEGIN
     DECLARE @ReplyMsg NVARCHAR(100);
     SELECT @ReplyMsg =
     N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';

     SEND ON CONVERSATION @RecvReqDlgHandle
          MESSAGE TYPE 
          [//AWDB/1DBSample/ReplyMessage]
          (@ReplyMsg);

     END CONVERSATION @RecvReqDlgHandle;
END

SELECT @ReplyMsg AS SentReplyMsg;

COMMIT TRANSACTION;

【问题讨论】:

    标签: sql-server queue service-broker


    【解决方案1】:

    答案 1: 所有示例都没有使用 begin try...end try begin catch...end catch 来处理异常,因为它们是示例 - 所以它们应该简洁明了用于理解而不是包含用于在生产中实现的代码。

    答案 2: 可以对 SSB 语句进行长期事务处理。 SSB 有助于避免关键的长期事务。您可以使用 SSB 开始异步处理,并立即在您的关键代码中更进一步。也许您应该找到其他解决方案而不是 SSB,特别是针对您的情况。

    答案 3: 这不是错误,因为RECEIVE TOP(1) 可能包含另一条消息,例如错误消息。因此,您似乎需要将处理代码重新定位在 IF...END 部分中,这意味着您收到了正确的消息并且应该对其进行处理:

    IF @RecvReqMsgName =
       N'//AWDB/1DBSample/RequestMessage'
    BEGIN
    
     -- Process.... May take a long time
    
     DECLARE @ReplyMsg NVARCHAR(100);
         SELECT @ReplyMsg =
         N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
         SEND ON CONVERSATION @RecvReqDlgHandle
              MESSAGE TYPE 
              [//AWDB/1DBSample/ReplyMessage]
              (@ReplyMsg);
    
         END CONVERSATION @RecvReqDlgHandle;
    END
    

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2010-09-19
      • 2010-11-21
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多