4

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

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

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

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

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

谢谢

4

1 回答 1

4

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

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

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

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

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

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

于 2010-08-12T01:55:50.263 回答