我们有一些看起来有点像这样的代码(错误处理和其他删除的东西)
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();
答案 0 :(得分:1)
在这种情况下,您会收到消息并将其从队列中删除。你将无法再收到它..
如果所有代码都在事务中并且消息处理中存在错误 - 事务永远不会提交并且消息保留在队列中(默认情况下 - 在5个回滚队列被禁用后)。因此,您可以检测错误的原因,更正它并再次处理消息(预期的异常不会导致回滚,有很多方法可以处理它们)。
我会说一切都应该在交易中。