生产环境中无法解释的SQL错误 - 可能与网络相关

Fli*_*kut 6 c# sql-server asp.net entity-framework

我正在做一些相当密集的数据库工作,最终在数据库中插入了许多很多记录.为了最大限度地减少上下文膨胀,我一次执行100个插入,处理上下文,并重新创建上下文.

我得到了一些我不理解的奇怪错误.这些错误只发生在我们的生产服务器上,但在开发服务器上一切都很好.如果有人能够对他们认为可能存在的问题有所了解,我一定会很感激.

System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常

System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误.(提供者:TCP提供者,错误:0 - 信号量超时期限已过期.)

System.ComponentModel.Win32Exception:信号量超时期限已过期

System.Data.SqlClient.SqlException(0x80131904):从服务器接收结果时发生传输级错误.(提供程序:TCP提供程序,错误:0 - 指定的网络名称不再可用.)

System.ComponentModel.Win32Exception(0x80004005):指定的网络名称不再可用

System.Data.Entity.Infrastructure.CommitFailedException:提交数据库事务时报告了错误,但无法确定数据库服务器上的事务是成功还是失败.有关详细信息,请参阅内部异常和http://go.microsoft.com/fwlink/?LinkId=313468.> System.Data.SqlClient.SqlException:从服务器接收结果时发生传输级错误.(提供程序:TCP提供程序,错误:0 - 指定的网络名称不再可用.)

System.ComponentModel.Win32Exception:指定的网络名称不再可用

System.Data.Entity.Core.EntityException:引发了一个异常,可能是由于瞬态故障引起的.如果要连接到SQL Azure数据库,请考虑使用SqlAzureExecutionStrategy.

System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常

System.Data.SqlClient.SqlException:将请求发送到服务器时发生传输级错误.(提供者:TCP提供者,错误:0 - 远程主机强行关闭现有连接.) -

System.ComponentModel.Win32Exception:远程主机强制关闭现有连接

这些错误在过程中发生的时间是完全随机的(我有一个计数器告诉我在哪里).查看这些错误,看起来好像是网络错误.我无法访问我的数据库服务器日志,所以我无法查看.我的网络服务器日志不会对正在发生的事情有任何启发.任何帮助都会很棒.

编辑:

我没有运行Azure.

我也遇到了大量的主键违规错误:

System.Data.Entity.Infrastructure.DbUpdateException:更新条目时发生错误.有关详细信息,请参阅内部异常

System.Data.Entity.Core.UpdateException:更新条目时发生错误.有关详细信息,请参阅内部异常

System.Data.SqlClient.SqlException:违反PRIMARY KEY约束'PK_dbo.MissileDataReferences'.无法在对象'dbo.MissileDataReferences'中插入重复键.重复键值为(4277,2,448388).

Rya*_*ill 4

他们很烦人不是吗?是的,您可以在任何高容量网站上获得这些内容。

这似乎就是微软在 SQL Azure 中引入 Azure 重试策略的原因。您甚至希望他们能够保证其网站和同一网络上同一数据中心的数据库之间的连接。但他们不能。

您可以为 Azure 打开此功能(您没有说您是否正在使用 Azure,但我怀疑不是)。请参阅https://learn.microsoft.com/en-us/azure/sql-database/sql-database-connectivity-issues了解所需的连接字符串更改。

https://msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx还涵盖 Azure 上的 EF6。

也许这不是您想要的答案,但我认为您应该考虑使用Polly 库,因为它使您能够为每个命令显式设置重试逻辑。

为什么您不想对每个调用都执行此操作(以节省每个命令的重试编码)?好吧,我过去遇到过很多问题,我们重试了插入等逻辑,并在稍后再次重复(导致主键冲突),因为响应没有返回给客户端。

因此,仅针对安全的“只读”调用执行此操作,如果必须重试写入,请放置处理程序以检测重复插入,然后与服务器仔细检查并询问用户他们想要做什么。