【发布时间】:2011-11-10 23:56:03
【问题描述】:
我有一个具有自托管 WCF 服务的解决方案。该服务连接到 EF 并且可以正常读写。
在同一个解决方案中,我还托管了一个 NServiceBus 端点。它从单独的运行解决方案中获取事件。
当我(单独)运行 NServiceBus 项目时,它似乎工作正常,直到我尝试查询我的数据库。当我这样做时,我得到了这个 EntityException:
底层提供程序在打开时失败。
内部异常是带有以下消息的 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);
虽然在很多情况下这听起来是件好事。
【问题讨论】:
-
您在使用 TransactionScope 吗? NServiceBus 使用什么传输方式?是带有事务队列的 MSMQ 吗?
-
@LadislavMrnka - 我不是故意使用 TransactionScope。如果 EF 在后台使用它,我不知道。 NServiceBus 正在使用带有事务队列的 MSMQ。
-
@Vaccano - 禁止交易是个坏主意。这样做意味着您没有在同一个事务中针对您的数据库和消息队列进行操作。您可以提交数据库事务并中止消息队列事务,这意味着您将执行相同的数据酶事务两次。应该很少有您不想要这种原子性的例外情况。
标签: entity-framework nservicebus msdtc