代码之家  ›  专栏  ›  技术社区  ›  Barguast

在队列之间发送时,TransactionScope是否提升为MSDTC?

  •  5
  • Barguast  · 技术社区  · 12 年前

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

    但是,MSDTC似乎被用于执行此事务,因此它比使用标准MessageQueueTransaction慢得多。这种情况应该发生吗?我的印象是,只有当作用域涉及(例如,消息队列读取和数据库写入)时,TransactionScope才会提升为外部事务,而不是仅涉及多个消息队列时。

    谢谢

    编辑:目前这一切都在我的笔记本电脑上,所以我确信没有其他机器参与其中。

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

    编辑2:当我只是向一个队列写入时,我也会有同样的行为!即。

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

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

    3 回复  |  直到 12 年前
        1
  •  3
  •   Barguast    12 年前

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

        2
  •  0
  •   Jens H    12 年前

    看看这篇MSDN文章: Transaction Management Escalation

    以下列出了典型的升级行为,如(亮点是我的):

    当您想将事务提供给另一个对象时 在另一个 应用程序域 (包括 穿过 过程和 机器边界 ) 在 同一台计算机 ,系统交易基础设施 自动升级要由Microsoft管理的事务 分布式事务协调器(MSDTC)。升级还包括 如果您入伍,则会发生 另一个持久资源管理器 当升级时, 事务保持在提升状态下进行管理,直到 完成

    正如您所看到的,不仅当您在网络上做事时,而且即使您在同一台机器上做事,也可能发生提升。(例如,我最近遇到了一个问题,我从同一(集群)服务器上的Windows服务访问MS SQL数据库。)

    此外,如果WCF服务涉及到流程中的某个位置,也可能发生这种情况。

        3
  •  0
  •   Donald Fraser    5 年前

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

    这种说法是不对的。TransactionScope将处理消息队列中的本地事务,只是它使用MSDTC来处理。