【问题标题】:Entity Framework Exception on Windows 2019 when using MSDTC使用 MSDTC 时 Windows 2019 上的实体框架异常
【发布时间】:2019-08-29 15:22:02
【问题描述】:

我们有 2 台服务器。一个盒子是在 Windows Server 2016 上运行的 MS SQL Server 2017 (14.0.3192.2)。另一个是运行 EF 6.2.0 的 Web 服务的 Windows Server 2019 盒子。 2019 年的盒子是新的,生产 Web 服务正在 Win 2k12 R2 服务器上运行,目前没有问题。当 EF 需要在一个调用中执行多个事务时,听起来该调用被提升为使用 MS 分布式事务协调器。在新的 2019 服务器上,我们看到这些请求被中止。我们在代码中看到的异常是“该操作对于当前的登记状态无效”。我已经完成了所有的 DTC 故障排除,但似乎一切都检查出来了。我们不使用 Windows 防火墙,服务器之间也没有防火墙。本地 DTC 配置与我们现有的服务器匹配,并且 dtcping.exe 工具报告服务器之间的通信没有问题。如果我们关闭导致多个事务的代码,那么问题就会消失,所以一切都指向 EF 和 MSDTC 之间的问题。

我们也无法在我们的开发计算机上运行多个事务(Windows 10)。在较新版本的 Windows 中,EF 和 DTC 是否可能出现问题,或者我们遗漏了什么?

我在 EF github 项目中询问并被告知这可能比 EF 更适合 sql-client 团队。我也在这上面标记了 sqlclient。

【问题讨论】:

  • 有没有办法更改代码,因此不需要 DTC?
  • 是的。我们也在探索这一点。 EF 目前正在升级与 DTC 的连接,因为我们有一个用于生产数据库的历史数据库。自动映射器在 EF 执行更新/插入时将记录的副本提交到历史数据库,这导致同一数据库上下文连接中的多个事务。我希望也许有人知道如何解决它,这样我们就可以保持相同的过程。
  • 如果您使用相同的 DbContext 连接,则不需要 DTC。仅当您在两个 不同 SqlConnections 上登记事务时,才会升级到 DTC 事务。或者,您可以通过写入历史数据库的连接来防止登记,并使其成为“自主”事务。
  • 在我们的例子中,看起来我们需要 2 个 DbContext 连接。历史数据库是具有不同连接字符串的不同数据库。仍在寻找有关如何解决 DTC 问题的想法。我已经在线完成了标准的故障排除步骤,并检查了 DTC 连接。不确定 DTC 为何中止(并导致 EF 失败)。

标签: entity-framework entity-framework-6 msdtc sqlclient


【解决方案1】:

我们尝试下拉实体框架 6.3.0 预览版 9 nuget 包并在新的 Windows 2019 服务器上对其进行测试,并且 DTC 神奇地与 Scoped Transactions 一起工作(不会中止)。 EF 6.3.0 版本中的某些内容必须解决我们在使用 EF 6.2.0 公共 nuget 版本中止 DTC 事务时遇到的问题。

由于 6.3.0 仍处于预览阶段,我们同时回滚到 6.2.0 并关闭了我们的作用域事务,直到 6.3.0 完全发布。我将更新有关此问题的 github 问题,以便开发团队知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多