gpt4 book ai didi

sql-server - Sql Service Broker 和事务

转载 作者:行者123 更新时间:2023-12-04 02:16:36 24 4
gpt4 key购买 nike

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

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

问题二:如果消息消费/处理时间过长怎么办?在 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: 所有示例都不使用 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

关于sql-server - Sql Service Broker 和事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13978281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com