Sql-Server

更新條目時出錯。有關詳細資訊,請參閱內部異常。一世ññ和R一世ññ和RINNER執行超時已過期

  • November 24, 2021

我們的生產 SQL Server 之一的數據庫性能不佳。在應用程序方面,他們遇到了這個錯誤:

更新條目時出錯。有關詳細資訊,請參閱內部異常。

$$ INNER $$執行超時已過期。操作完成前超時時間已過或伺服器未響應。

$$ INNER $$等待操作超時;

這些是我們嘗試解決的以下問題:

  1. 檢查是否有任何鎖定和阻塞正在進行 - 沒有發生重大阻塞。如果發生阻塞,則資源會被阻塞不到 1 分鐘並針對不同的數據庫。
  2. 使用分析器擷取的查詢。我們注意到插入、更新和選擇是同時發生的。所以我們假設某處可能發生了內部鎖定,但不知道在哪裡。
  3. 不存在碎片。
  4. SQL Server 錯誤日誌中沒有產生任何錯誤。
  5. 擷取了一周的性能計數器,但沒有顯示任何關鍵資訊。

以前有沒有人遇到過這些錯誤?如果是這樣,您採取了哪些措施來排除故障並解決錯誤?

預設情況下,.Net 客戶端有30 秒的客戶端命令超時。您看到的錯誤是伺服器的響應時間超過 30 秒。

下面是一些範例 C# 程式碼,通過執行等待 31 秒的WAITFOR DELAY語句來顯示問題:

using System;
using System.Data.SqlClient;

namespace ConnectionTimeoutTest
{
   class Program
   {
       static void Main(string[] args)
       {
           SqlConnectionStringBuilder sqlConnectionStringBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder
           {
               InitialCatalog = "tempdb",
               IntegratedSecurity = true,
               DataSource = "localhost"
           };

           using SqlConnection connection = new SqlConnection();
           connection.ConnectionString = sqlConnectionStringBuilder.ConnectionString;
           connection.Open();
           using SqlCommand sqlCommand = new SqlCommand("WAITFOR DELAY '00:00:31';SELECT 'Hello World!';", connection);
           SqlDataReader reader = sqlCommand.ExecuteReader();
           while (reader.Read())
           {
               Console.WriteLine(reader.GetString(0));
           };
       }
   }
}

還有一個例外:

System.Data.SqlClient.SqlException

HResult=0x80131904

**消息=超時已過期。在操作完成之前超時時間已過或伺服器沒有響應。

Source=Core .Net SqlClient 數據提供程序**

StackTrace:

在 System.Data.SqlClient.SqlConnection.OnError(SqlException 異常,布爾 breakConnection,Action wrapCloseInAction)

在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 異常,布爾 breakConnection,Action wrapCloseInAction)

在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布爾呼叫者HasConnectionLock,布爾非同步關閉)

在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)

在 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()

在 System.Data.SqlClient.SqlDataReader。 get_MetaData()

在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)

在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布爾返回流,布爾非同步,Int32 超時,任務&任務,布爾 asyncWrite,SqlDataReader ds)

在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,TaskCompletionSource`1 完成,Int32 超時,Task& 任務,布爾 asyncWrite,String 方法)

在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior , RunBehavior runBehavior, Boolean returnStream, String method)

at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)

at System.Data.SqlClient.SqlCommand.ExecuteReader()

at ConnectionTimeoutTest.Program.Main(String

$$ $$args) 在 C:\Users\Hannah.MVCT\source\repos\ConnectionTimeoutTest\ConnectionTimeoutTest\Program.cs:line 23 內部異常 1:

Win32Exception:等待操作超時。

這是使客戶端等待 60 秒的修復程序:

using System;
using System.Data.SqlClient;

namespace ConnectionTimeoutTest
{
   class Program
   {
       static void Main(string[] args)
       {
           SqlConnectionStringBuilder sqlConnectionStringBuilder = new System.Data.SqlClient.SqlConnectionStringBuilder
           {
               InitialCatalog = "tempdb",
               IntegratedSecurity = true,
               DataSource = "localhost"
           };

           using SqlConnection connection = new SqlConnection();
           connection.ConnectionString = sqlConnectionStringBuilder.ConnectionString;
           connection.Open();
           using SqlCommand sqlCommand = new SqlCommand("WAITFOR DELAY '00:00:31';SELECT 'Hello World!';", connection);
           sqlCommand.CommandTimeout = 60;  // <---- this is new
           SqlDataReader reader = sqlCommand.ExecuteReader();
           while (reader.Read())
           {
               Console.WriteLine(reader.GetString(0));
           };
       }
   }
}

上面的程式碼在GitHub中可用。

您可以採取的第一步來解決您的錯誤:

  1. 嘗試Connection Timeout將連接字元串中的屬性從預設的 15(或 30)增加到 60 或更多秒
  2. 嘗試增加對象CommandTimeout的屬性SqlCommand(漢娜的答案非常詳細地說明瞭如何做到這一點)。

直到最近,.NET System.Data.SqlClient驅動程序才允許通過對象設置CommandTimeout唯一的。SqlCommand請注意,在較新的Microsoft.Data.SqlClient驅動程序中,特別是 v2.1,您現在可以通過連接字元串設置它,它將自動應用於與該連接關聯的任何 SqlCommand

如果 #1 減少或消除了錯誤,那麼您遇到了連接錯誤

如果 #2 有幫助(比 #1 更有可能),那麼您遇到了長時間執行的查詢問題(超過 30 秒),您必須更深入地探勘了解導致查詢緩慢的原因

引用自:https://dba.stackexchange.com/questions/295601