代码之家  ›  专栏  ›  技术社区  ›  Xavier Poinas

我需要NServicebus/NHibernate的MSDTC吗?

  •  4
  • Xavier Poinas  · 技术社区  · 14 年前

    我正在编写一个NServiceBus解决方案,并尝试使用dbsubscriptionstorage。这将使用nhibernate进行数据访问,我得到以下异常:

    合作伙伴事务管理器已禁用对远程/网络事务的支持

    我可以启用MSDTC,但我的问题是:这个需求来自哪里,我可以删除它吗?

    我不熟悉NHibernate,我不知道它是否需要MSDTC或NServiceus。在nservicebus订阅数据库中只有一个平面表,在这个场景中我几乎看不到msdtc的使用。

    我可以删除MSDTC要求吗?为此,我需要编写自己的订阅持久层吗?

    谢谢

    1 回复  |  直到 14 年前
        1
  •  4
  •   Dave Markle    14 年前

    MSDTC是一种伟大的小动物,但可能是相当阴险的。

    首先,我建议如果您知道您不想成为分布式事务的一部分,那么您应该在开发服务器上关闭它。您不想在dev中自动升级到分布式事务,只想发现它会降低您的实际性能,或者在生产中不起作用。

    也就是说,答案是像NHibernate这样的ORM没有,但是如果满足以下条件之一,就很可能涉及MSDTC:

    • 您正在查询链接到其他服务器的事务中的视图/表。
    • 您在一个TransactionScope中使用了两个sqlConnections(或nhibernate使用的任何类型)
    • 您正在TransactionScope中登记另一个事务性组件(如msmq或事务性文件系统)。

    如果满足这些条件中的任何一个(肯定还有其他一些我已经忘记了),您的事务将自动升级为分布式事务,并且MSDTC必须参与其中。这意味着不仅必须为您的设备工作并配置msdtc,还必须为所有希望参与您的事务的设备配置msdtc。在一个简单的SQL服务场景中,这意味着您的应用服务器和SQL服务器都需要运行它并为分布式事务进行配置。

    我不熟悉nservicebus,但我倾向于认为它具有各种各样的功能,可以事务性地将消息放在队列上,比如说。

    推荐文章