2012-12-20 172 views
3

所有MSDN上的例子放在交易中发送和接收的语句。下面的脚本是http://msdn.microsoft.com/en-US/library/bb839499(v=sql.100).aspxSQL服务代理和交易

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

问题2:如果消息消耗/处理需要多长时间?在SSB报表上进行长时间交易可以吗?什么是最好的方法?

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

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; 

回答

1

答1:所有示例不使用开始尝试...结束尝试开始抓......抓到底,因为他们的例子来处理异常 - 所以他们应该是简洁和明确的理解而不是包含生产实施的代码。

答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