2012-12-20 171 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