我已经减少了一个问题,我需要使用以下示例代码:
var inQueue = ".\private$\testqueue";
using (var ts = new TransactionScope())
{
using (var q = new MessageQueue(inQueue, QueueAccessMode.Send))
{
for (var i = 0; i < 100000; ++i)
{
var msg = new Message(i);
q.Send(msg, MessageQueueTransactionType.Automatic);
}
}
ts.Complete();
}
正如您所看到的,它使用TransactionScope模式将100,000个整数写入(事务性,本地)队列。我的理解是这种类型的操作不会升级为DTC交易。
但是,如果我在运行时打开组件服务,我可以在本地DTC中看到该事务&gt;交易清单。这意味着交易已经升级,对吗?
为什么会这样?我在另一个程序中因性能不佳而被提示,并且看起来使用DTC进行这样一个简单的事务可能是一个因素。无论如何,我只是想了解原因。
任何帮助都将不胜感激。
答案 0 :(得分:6)
来自http://geekswithblogs.net/dotnetrodent/archive/2008/04/16/121279.aspx
如果您只需要进行与消息队列相关的事务性工作, 没有任何其他资源需要在交易中 上下文(如数据库),不要使用TransactionScope,而是使用 MessageQueueTransaction class。用这个 用于控制仅与消息队列相关的事务的类 与使用完整分布式相比,性能损失较小 交易由DTC控制。