我有一个拥有自托管WCF服务的解决方案。该服务连接到EF,可以正常读写。
在同一解决方案中,我还托管了一个NServiceBus端点。它从单独的运行解决方案中获取事件。
当我运行NServiceBus项目(单独)时,似乎工作正常,直到我尝试查询我的数据库。当我这样做时,我得到这个EntityException:
底层提供程序在Open上失败。
内部异常是TransactionException,消息为:
合作伙伴事务管理器已禁用其对远程/网络事务的支持
我的NServiceBus和WCF服务项目都使用完全相同的配置和EF项目。我不明白为什么一个失败而另一个失败。
我做了一些谷歌搜索并遇到了这个页面:http://msdn.microsoft.com/en-us/library/aa561924%28BTS.20%29.aspx向我展示了如何设置MSDTC,我在我的客户端计算机上完成了它。但它没有效果。
我还发现这个问题需要设置:NServiceBus: System.Transactions.TransactionException: The partner transaction manager has disabled its support for remote/network transactions。但它没有说明为什么或在哪里。
我是否需要在数据库服务器上设置MSDTC?如果是这样,为什么?什么是MSDTC?
为什么从NServiceBus托管进程运行会导致此错误?
更新:我发现这个link帮助我理解了DTC的作用。它还告诉我如何在需要时将其关闭:
using (TransactionScope sc=new TransactionScope(TransactionScopeOption.Suppress))
YourDatabaseHandler.SaveMyStuff(whatever);
虽然在许多情况下听起来好像是件好事。
答案 0 :(得分:6)
由于NSB正在使用事务性队列,因此您将参与分布式事务。这意味着参与的每台机器都必须投票决定是否完成交易。这是通过分布式事务处理协调器(MSDTC)完成的。这必须在两台机器上运行(如果您使用其他数据库,如Oracle,则还有其他服务)。要管理MSDTC,请转到组件服务 - >计算机 - >我的电脑 - >分布式事务协调器 - >本地DTC。右键单击该节点,您将找到包括安全性在内的所有配置。