【发布时间】: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