2010-08-12 28 views
4

我正在写一个NServiceBus解决方案并尝试使用DBSubcriptionStorage。这将使用NHibernate的数据访问,我得到以下异常:NServiceBus/NHibernate需要MSDTC吗?

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

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

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

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

感谢

+3

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

回答

4

MSDTC是一个伟大的小动物,但可以说是相当阴险。

首先,我建议如果您知道您从未想过要成为分布式事务的一部分,那么您在开发服务器上将其关闭。您不希望自动提升到DEV中的分布式事务,只会发现它会杀死您的实际性能或在生产中无法正常工作。

话虽这么说,答案是一样的NHibernate的ORM不这样做,但它很可能得到MSDTC参与,如果这些条件之一:

  • 要查询内部的视图/表交易链接到另一台服务器。
  • 您正在使用两个SqlConnections(或不管它是NHibernate的使用)单一的TransactionScope
  • 你争取其他事务性组件(如MSMQ或事务文件系统),一个TransactionScope内内。

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

我不熟悉NServiceBus,但我倾向于认为它会有各种功能,这些功能会将事务放置在队列中。

+0

感谢您提供详细信息,它的确有助于理解背后的原因。 NServiceBus基于MSMQ,因此可能是.. – 2010-08-12 04:30:46

+5

NServiceBus使用DTC运行数据库调用,并在同一个tx中从其输入队列中删除消息。订阅与其他所有消息到达同一输入队列的事实意味着您必须放弃所有消息的ACID行为,请将msmqtransport配置为非事务性的以实现此目的,以便不使用DTC。这就是说,保证上述一致性的能力是恕我直言,NSB的关键卖点之一,所以会建议你坚持交易队列,并启用DTC – 2010-08-12 05:27:11

+0

“首先,我建议如果你知道你不想成为分布式事务EVER的一部分,您在开发服务器上将其关闭“ 您无法给出原因。 – Paco 2010-08-12 09:02:19