MSDNのすべての例では、送信ステートメントと受信ステートメントをトランザクションに入れています。次のスクリプトは、 http://msdn.microsoft.com/en-US/library/bb839499( v = sql.100 ).aspxからのものです。
質問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;