3

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;
4

1 に答える 1

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
于 2012-12-21T15:29:37.640 に答える