【问题标题】:Calling Entity Framework from a NServiceBus method causes an error从 NServiceBus 方法调用实体框架会导致错误
【发布时间】: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


【解决方案1】:

由于 NSB 使用事务队列,因此您将参与分布式事务。这意味着每台参与的机器都必须投票决定是否完成交易。这是通过分布式事务协调器 (MSDTC) 完成的。这必须在两台机器上运行(如果您使用其他数据库,如 Oracle,则需要额外的服务)。要管理 MSDTC,请转到组件服务 -> 计算机 -> 我的电脑 -> 分布式事务协调器 -> 本地 DTC。右键单击该节点,您将找到所有配置,包括安全性。

【讨论】:

  • “这必须在两台机器上运行” - 你是说我的数据库服务器吗?我真的很想知道为什么。我的 NServiceBus 进程只是调用 EF 来保存到数据库。 EF 怎么知道我从 NServiceBus 获取数据?我可以轻松地将其保存到文件中,然后将其加载到另一个进程中,然后保存。流程如何知道我保存的数据是“分布式事务”的一部分?
  • @Vaccano - ef 不知道涉及到 nservicebus。但是,nservicebus 使用的事务范围在处理程序执行期间处于范围内。 ef 将尝试加入已经处于活动状态的事务。如果 dtc 没有在启用网络访问的两台机器(是的,执行处理程序的机器和数据库服务器)上运行,这将失败。这几乎在所有情况下都是您想要的,因为您希望消息队列事务和数据库事务之间具有原子性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多