我是否需要NSDviceBus / NHibernate的MSDTC?

时间:2010-08-12 01:32:26

标签: nhibernate nservicebus msdtc

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

  

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

我可以启用MSDTC,但我的问题是:此要求来自何处,我可以将其删除吗?

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

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

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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