ServiceBroker对话应该在事务中

时间:2012-06-29 10:52:22

标签: c# sql-server-2008 service-broker

我们有一些看起来有点像这样的代码(错误处理和其他删除的东西)

using (var tran = conn.BeginTransaction())
{
    var client = new Service(...);
    var dialog = client.GetConversation(null, conn, tran);
    var response = dialog.Receive();

    // do stuff with response, including database work

    dialog.Send(message, conn, tran);
    dialog.EndConversation(conn, tran);

    tran.Commit();
    conn.Close();
}

我们继承了这段代码并且不是ServiceBroker的专家,如果我们将对话移到事务之外会不会出现问题:

var client = new Service(...);
var dialog = client.GetConversation(null, conn, tran);
var response = dialog.Receive();

using (var tran = conn.BeginTransaction())
{
    // do stuff with response, including database work
    tran.Commit();
}

dialog.Send(message, conn, tran);
dialog.EndConversation(conn, tran);
conn.Close();

1 个答案:

答案 0 :(得分:1)

在这种情况下,您会收到消息并将其从队列中删除。你将无法再收到它..

如果所有代码都在事务中并且消息处理中存在错误 - 事务永远不会提交并且消息保留在队列中(默认情况下 - 在5个回滚队列被禁用后)。因此,您可以检测错误的原因,更正它并再次处理消息(预期的异常不会导致回滚,有很多方法可以处理它们)。

我会说一切都应该在交易中。