【问题标题】:Do I need MSDTC for NServiceBus / NHibernate?NServiceBus / NHibernate 是否需要 MSDTC?
【发布时间】:2010-08-12 01:32:25
【问题描述】:

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

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

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

我不熟悉 NHibernate,我不知道它是否需要 MSDTC 或 NServiceBus 是否需要。 NServiceBus 订阅数据库中只有一个平面表,在这种情况下我几乎看不到 MSDTC 的使用。

我可以删除 MSDTC 要求吗?我是否必须为此编写自己的订阅持久层?

谢谢

【问题讨论】:

  • 只是为了补充这篇文章,以防有人正在寻找有关该主题的信息:NServiceBus 有一个 InstallDtc 配置文件,可用于根据需要自动设置系统。便于部署。

标签: nhibernate nservicebus msdtc


【解决方案1】:

MSDTC 是一种很棒的小动物,但也可能非常阴险。

首先,如果您知道自己不想成为分布式事务的一部分,我建议您在开发服务器上将其关闭。您不想在 DEV 中自动提升为分布式事务,只是发现它会破坏您的实际性能或在生产环境中不起作用。

话虽如此,答案是像 NHibernate 这样的 ORM 没有,但如果满足以下条件之一,就很有可能让 MSDTC 参与进来:

  • 您正在查询链接到另一个服务器的事务中的视图/表。
  • 您在单个 TransactionScope 中使用了两个 SqlConnections(或 NHibernate 使用的任何东西)
  • 您正在 TransactionScope 中征用另一个事务组件(如 MSMQ 或事务文件系统)。

如果满足这些条件中的任何一个(肯定还有一些我忘记了),您的事务将自动提升为分布式事务,并且 MSDTC 必然会参与其中。这意味着不仅必须为您的盒子工作和配置 MSDTC,还必须为所有想要参与您的交易的盒子进行配置。在简单的 SQL Serve 场景中,这意味着您的应用服务器和 SQL Server 都需要运行并配置分布式事务。

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

【讨论】:

  • 感谢您提供如此详细的信息,这确实有助于理解其背后的原因。 NServiceBus 是基于 MSMQ 的,所以可能是这样的......
  • NServiceBus 使用 DTC 来运行数据库调用并从同一 tx 中的输入队列中删除消息。订阅到达与所有其他消息相同的输入队列这一事实意味着您必须放弃所有消息的 ACID 行为,将 msmqtransport 配置为非事务性以实现此目的,以便不使用 DTC。也就是说,保证上述一致性的能力是恕我直言 NSB 的主要卖点之一,因此建议您坚持使用事务队列并启用 DTC
  • “首先,我建议如果你知道你不想成为分布式事务的一部分,那么你在你的开发服务器上关闭它”你不要给出理由那个。
  • @Paco:继续阅读下一句话,你就会找到原因。
  • @Paco,如果您认为分布式事务通常不会导致显着的性能损失,您可能需要一些证据来支持这一点。无论哪种方式,在不了解其影响的情况下使用分布式事务进行编程都是非常不明智的。如果您不希望使用它们,则应该关闭 DTC。这样,如果他们确实获得了自动晋升,就会发生错误,他们可以评估他们是否真的打算首先参与分布式事务。
猜你喜欢
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多