【问题标题】:How to handle connection errors to SQL Azure DDBB with EF6如何使用 EF6 处理与 SQL Azure DDBB 的连接错误
【发布时间】:2016-05-02 08:45:39
【问题描述】:

我有一个使用 ASP.NET MVC 4 开发的 Worker Role,它在 Azure 中实现了一个 REST WS。它使用 Entity Framework v6 连接到 Azure SQL DDBB。通常它工作正常,但有时我在尝试使用此消息写入 DDBB 时会遇到异常:

提交数据库事务时报告了一个错误,但它 无法确定交易是成功还是失败 数据库服务器

错误似乎是应用服务器和 DDBB 之间的连接问题。我已经实现了 SQLAzureExcutionStrategy(解释为 here)来获得连接弹性,但这并不能防止错误,因为连接问题似乎在提交期间发生,所以 EF 不知道是否必须重试或不是。

有一个解决方案解释了here,它建议创建一个“跟踪检查表”以便在每个事务中插入一个“跟踪行”,如果发生临时异常(如我的)然后检查该行是否存在或不在表中决定是否撤消。但是我不确定这种方法在使用像 EF 这样的 ORM 时是否有效。

当我执行 DbContext.SaveChanges() 并且在事务期间发生连接问题时。 ¿ 我可以假设全部或全部都没有提交吗?如果不是,我应该采用哪种策略?尝试在每次实体更新时执行 SaveChanges?

提前感谢您提供的任何帮助。

问候, 伊万。

【问题讨论】:

标签: azure entity-framework-6 azure-sql-database azure-worker-roles transient


【解决方案1】:

如果你不自己开始事务,SQLAzureExcutionStrategy 支持DbContext.SaveChanges()(不管有多少实体)。检查here

否则,如果你真的需要使用跟踪检查表。如果您在检查时遇到连接错误会发生什么?你还需要做更多的工作来处理这个问题。您应该对所有交易执行此操作。因为你不知道哪一个会出错。错误非常罕见。所以,它非常昂贵。

如果可以,请遵循什么都不做使用数据库重置状态之间的解决方案。向用户显示/返回有意义的消息,什么也不做。我遵循这个解决方案,这对我来说已经足够了。

我的建议:如果您不自己开始事务,请继续使用 SQLAzureExcutionStrategy。否则,请尝试选择最适合您的解决方案,开始检查最便宜的解决方案(什么都不做)。

【讨论】:

  • 您好 Erkan,感谢您的回答,对于我迟到的回复感到抱歉。我自己不使用事务,但 SQLAzureExecutionStrategy 在那种情况下不起作用。事务期间发生连接错误,EF 无法知道是否需要重试。实际上在某些情况下会发生异常,但提交已经完成。我所做的是将我的 AzureDDBB 从 S0 升级到 S20,现在这个连接错误没有发生。
  • 很抱歉这次更新,但@IvanBASART 您是否仅通过扩展数据库 DTU 解决了这个问题?
【解决方案2】:

最好的方法是执行文章中的选项 3。最好的方法是使用存储过程来写入和读取信息,遵循以下规定:

选项 3 - 手动跟踪交易

  1. 向用于跟踪事务状态的数据库添加一个非跟踪表。
  2. 在每个事务开始时向表中插入一行。
  3. 如果在提交期间连接失败,请检查数据库中是否存在相应的行。 如果该行存在,则正常继续,因为事务已成功提交 如果该行不存在,请使用执行策略重试当前操作。
  4. 如果提交成功,删除对应行,避免表增长。

轨道表不应外露。这就是为什么我们必须将所有内容都封装在存储过程中。

谢谢, 米哈埃拉

【讨论】:

  • 您好 Mihaela,感谢您的回答,并对我迟到的回复感到抱歉。我认为(我不确定这就是我的问题的原因)使用 EF 作为 DBContext.SaveChanges() 可能会处理不同的提交,这个选项不可靠。我所做的是将我的 AzureDDBB 从 S0 升级到 S20,现在这个连接错误没有发生。
猜你喜欢
  • 2016-11-17
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
  • 2020-02-21
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多