5

我有一个简单的过程,它从一个队列中读取,处理消息,然后输出到另一个队列。我试图将此传输包装在 TransactionScope 中,以便从输入队列读取和写入输出队列都发生在同一个事务中。

但是,似乎正在使用 MSDTC 来执行此事务,因此它比使用标准 MessageQueueTransaction 慢得多。这应该发生吗?我的印象是 TransactionScope 只有在涉及范围时才会提升为外部事务,例如,读取消息队列和写入数据库,但如果只涉及多个消息队列则不会。

谢谢。

编辑:目前这一切都在我的笔记本电脑上,所以我确信不涉及其他机器。

我还想补充一点,我通过签入 Windows 的“组件服务”管理单元(即本地 DTC/事务列表)来确认正在发生升级的事务。我可以看到进入和离开这个屏幕的交易,我认为这意味着交易已经升级。我假设这个错了吗?

编辑2:当我只写一个队列时,我得到了同样的行为!IE

using (var ts = new TransactionScope())
{
    using (var q = new MessageQueue("..."))
    {
        /* write data */
    }

    ts.Complete();
}

尽管队列在本地计算机上,但我可以看到 DTC 与上述一起使用。

4

3 回答 3

3

似乎 TransactionScope 只处理与消息队列有关的外部事务。如果您希望它仅是内部的,则必须使用 MessageQueueTransaction。这与仅在需要时才升级事务的 SQL 事务不同,这让我感到困惑。

于 2012-09-18T13:38:16.033 回答
0

看看这篇 MSDN 文章:事务管理升级

此列表典型的升级行为,例如(重点是我的):

当您想将事务提供给同一台计算机上另一个应用程序域中的另一个对象(包括进程和机器边界)时,System.Transactions 基础结构会自动升级事务以由 Microsoft 分布式事务协调器 (MSDTC) 管理。如果您征用另一个持久资源管理器,也会发生升级。升级后,事务将在其升级状态下保持受管理状态,直到完成。

如您所见,提升不仅可以在您通过网络执行操作时发生,即使您在同一台计算机上执行操作也是如此。(例如,我最近在同一(集群)服务器上从 Windows 服务访问 MS SQL 数据库时遇到了麻烦。)

如果 WCF 服务在流程中的某处涉及,也可能发生这种情况。

于 2012-09-15T16:15:42.990 回答
0

似乎 TransactionScope 只处理与消息队列有关的外部事务。

这种说法是不正确的。TransactionScope 将处理消息队列中的本地事务,只是它使用 MSDTC 来执行此操作。

于 2019-06-04T12:56:36.947 回答