使用Entity Framework,我昨晚在其中一个应用程序中收到了以下一些例外情况:
System.Data.EntityException: The underlying provider failed on Commit. --->
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior
to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler,SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransaction(TransactionRequest transactionRequest, String name, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalTransaction.Commit()
at System.Data.SqlClient.SqlTransaction.Commit()
at System.Data.EntityClient.EntityTransaction.Commit()
--- End of inner exception stack trace ---
at System.Data.EntityClient.EntityTransaction.Commit()
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Data.Entity.Internal.InternalContext.SaveChanges()
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
这个错误的有趣之处在于数据实际上是写入数据库的。我found a related post on a MS site似乎表明这是与网络相关的错误。
我可以使用的一些问题是:
提前致谢。
更新
使用Ignite for SQL,我们能够确定来自另一个组的辅助SQL进程独占CPU,从而阻止我们的应用程序正常运行。简而言之,我们正在推进添加辅助服务器以防止两个团队之间的进一步冲突。
这个例外的有趣之处在于交易实际上是成功而不是失败。
答案 0 :(得分:1)
我敢打赌,事务提交命令的成功响应未发送(或发送速度不够快),导致代码中出现异常。有点疯狂的边缘情况。这种例外并不一定意味着命令的实际执行失败只是因为 A 失败。
同样地,如果从Web服务调用发送响应时出现问题,则不一定意味着该调用的任何副作用都未应用。
答案 1 :(得分:0)
+1卢克,解释很好。 错误的措辞是不幸的。
System.Data.EntityException: **The underlying provider failed on Commit.** --->
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior
应该阅读
System.Data.EntityException: **The underlying provider failed to respond to Commit**
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior
可能的原因是网络或服务器问题。例如100 CPU或其他服务器延迟仍然是正确的。但是你不知道它是否已经提交,如果这是一个超时的情况。 如果收到失败的响应,则DB应该回滚。当然,如果没有发生这种情况,那么数据库已经嗡嗡作响并导致潜在的腐败。我希望很少见。
我在10亿+行表中看到过......在增长空间分配期间,由于索引和数据区域需要扩展,需要超过30秒。但是COMMIT DID发生了。客户已超时。在线重组也可能导致这样的延迟(我至少在DB2上看到过这种情况)