我有一个简单的过程,它从一个队列中读取,处理消息,然后输出到另一个队列。我试图在TransactionScope中包装此传输,这样从输入队列读取和写入输出队列都发生在同一事务中。
但是,似乎MSDTC用于执行此事务,因此它比使用标准MessageQueueTransaction要慢得多。这应该发生吗?我的印象是,如果涉及范围(例如,消息队列读取和数据库写入),TransactionScope将仅提升到外部事务,但如果仅涉及多个消息队列则不会。
感谢。
编辑:目前我的笔记本电脑上都有这个,所以我确信没有其他机器参与其中。
我还想补充一点,我确认通过检入Windows“组件服务”管理单元(即本地DTC /交易列表)来进行升级交易。我可以看到进入和离开此屏幕的交易,我认为这意味着交易已经升级。假设这个我错了吗?
编辑2:当我写一个队列时,我得到了同样的行为!即。
using (var ts = new TransactionScope())
{
using (var q = new MessageQueue("..."))
{
/* write data */
}
ts.Complete();
}
尽管队列在本地计算机上,但我可以看到DTC与上述一起使用。
答案 0 :(得分:3)
似乎TransactionScope只处理与消息队列有关的外部事务。如果您希望MessageQueueTransaction仅用于内部,则必须使用它。这与SQL事务的工作方式不同,只有在需要时才会升级事务,这让我很困惑。
答案 1 :(得分:0)
查看此MSDN文章:Transaction Management Escalation
此列表典型的升级行为,如(突出显示是我的):
当您想要将交易提供给另一个对象时 应用领域(包括跨流程和机器边界) 在同一台计算机上,System.Transactions基础结构 自动升级要由Microsoft管理的事务 分布式事务协调器(MSDTC)。升级也 如果您登记另一个持久资源管理器,则会出现此问题。升级时, 交易仍处于高位状态,直至其成立 完成。
正如您所看到的,升级不仅发生在您通过网络进行操作时,而且即使您在同一台计算机上进行操作也是如此。 (例如,我最近在同一(集群)服务器上从Windows服务访问MS SQL数据库的情况下遇到了麻烦。)
如果在流程中的某个地方涉及WCF服务,也可能发生这种情况。
答案 2 :(得分:0)
似乎TransactionScope仅处理有关消息队列的外部事务。
此说法不正确。 TransactionScope将处理消息队列中的本地事务,只是它使用MSDTC来进行处理。