如何使用EF6处理与SQL Azure DDBB的连接错误

如何使用EF6处理与SQL Azure DDBB的连接错误,azure,entity-framework-6,azure-sql-database,azure-worker-roles,transient,Azure,Entity Framework 6,Azure Sql Database,Azure Worker Roles,Transient,我有一个使用ASP.NET MVC 4开发的工人角色,该角色在Azure中实现REST WS。它使用Entity Framework v6连接到Azure SQL DDBB。正常情况下,它工作正常,但有时我在尝试使用以下消息写入DDBB时会出现异常: 提交数据库事务时报告了一个错误,但它 无法确定上的事务是成功还是失败 数据库服务器 该错误似乎是应用服务器和DDBB之间的连接问题。我已经实施了SQLAzureExecutionStrategy(已解释)以获得连接弹性,但这并不能防止错误,因为连接

我有一个使用ASP.NET MVC 4开发的工人角色,该角色在Azure中实现REST WS。它使用Entity Framework v6连接到Azure SQL DDBB。正常情况下,它工作正常,但有时我在尝试使用以下消息写入DDBB时会出现异常:

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

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

有一个解决方案解释说,建议创建一个“跟踪检查表”,以便在每个事务中插入一个“跟踪行”,如果发生了暂时异常(如我的),则检查该行是否存在于表中,以决定是否重试。但我不确定这种方法在使用类似EF的ORM时是否有效

执行DbContext.SaveChanges()时,在传输过程中会发生连接问题。我可以假设全部或全部都没有承诺吗?如果没有,我应该采用哪种策略?是否尝试在每次实体更新时保存更改

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

问候,,
Ivan。

如果您不自己启动事务,SQLAzureExecutionStrategy支持
DbContext.SaveChanges()
(不管有多少个实体)。检查

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

如果可以,请遵循“不做任何事情”和“使用数据库重置状态”之间的解决方案。向用户显示/返回有意义的消息,但不执行任何操作。我遵循这个解决方案,这对我来说已经足够了


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

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

选项3-手动跟踪交易

  • 将非跟踪表添加到用于跟踪事务状态的数据库中
  • 在每个事务开始时向表中插入一行
  • 如果在提交期间连接失败,请检查数据库中是否存在相应的行。 如果行存在,则正常继续,因为事务已成功提交 如果该行不存在,请使用执行策略重试当前操作
  • 如果提交成功,请删除相应的行以避免表的增长
  • 轨道台不应暴露在外。这就是为什么我们必须将所有内容封装在存储过程中

    谢谢,
    米哈埃拉

    嗨,埃尔坎,谢谢你的回答,很抱歉我的回复太晚了。我自己不使用transacion,但SqlAzureExceptionStrategy在这种情况下不起作用。连接错误发生在事务期间,EF无法知道是否需要重试。实际上,在某些情况下会发生异常,但提交已经完成。我所做的是将我的AzureDDBB从S0升级到S20,现在没有出现连接错误。很抱歉进行此更新,但是@IvanBASART您是否通过扩展数据库DTU解决了此问题?嗨,Mihaela,谢谢您的回答,很抱歉我的回复太晚。我认为(我不确定这是我问题的原因)使用EF作为DBContext时,此选项不可靠。SaveChanges()可能会处理不同的提交。我所做的是将AzureDDBB从S0升级到S20,现在这个连接错误没有出现。我终于从微软得到了答案。我还没有测试过,但外观会起作用: