System.Data.EntityException:底层提供程序在Commit上失败

Ran*_*ndy 19 .net sql-server entity-framework transactions sqlclient

使用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()
Run Code Online (Sandbox Code Playgroud)

这个错误的有趣之处在于数据实际上是写入数据库的.我在MS网站上发现了一个相关帖子,似乎表明这是与网络相关的错误.

我可以使用的一些问题是:

  1. 我有什么选择来解决此错误?
  2. 它是否可能与网络相关,或者数据库是否可能成为嫌疑人?
  3. 如何从代码中判断交易是否真的完成了?
  4. 我应该在此错误上查询数据库以检查是否成功或只是重试事务?
  5. 如果我重试该事务,如何使用Entity Framework自动完成,还是只是捕获/重试?
  6. 我应该看看还有哪些其他物品?

提前致谢.

UPDATE

使用Ignite for SQL,我们能够确定来自另一个组的辅助SQL进程独占CPU,从而阻止我们的应用程序正常运行.简而言之,我们正在推进添加辅助服务器以防止两个团队之间的进一步冲突.

这个例外的有趣之处在于交易实际上是成功而不是失败.

Not*_*ple 2

我敢打赌,事务提交命令的成功响应未发送(或发送得不够快),导致代码中出现异常。有点疯狂的边缘情况。这种异常并不一定意味着命令的实际执行失败,只是出现了失败

同样,如果从 Web 服务调用发送响应时出现问题,并不一定意味着该调用的任何副作用都没有应用。