SqlClient 中可設定的重試邏輯

適用於: .NET Framework .NET .NET 標準

下載 ADO.NET

可設定的重試邏輯(CRL)可讓 Microsoft.Data.SqlClient 在暫時性失敗後,重試選取的 SqlCommand 和 SqlConnection 作業。 你可以選擇哪些錯誤符合資格,要嘗試多少次,延遲如何增加,以及哪些指令可以安全重複。

CRL 預設是關閉的。 你可以藉由將提供者指派給連線、命令或兩者來啟用它。 這兩個提供者是獨立的:指派一個提供者給連線,並不代表該連線所產生的指令會被套用。

注意

CRL 可在 Microsoft.Data.SqlClient 3.0 及更新版本中使用。 預設值為 SqlConfigurableRetryFactory.CreateNoneRetryProvider,且不會重試。

CRL 重試的內容

Scenario 指派提供者到 典型故障
開啟連線 SqlConnection.RetryLogicProvider 故障轉移、節流、資料庫短暫無法使用,以及在建立連線期間發生的傳輸失敗。
執行命令 SqlCommand.RetryLogicProvider 可在交易之外安全重試的特定陳述式失敗。

如需查看 SQL Server、Azure SQL Database、Azure SQL 受控執行個體、Microsoft Fabric 中的 SQL 資料庫,以及 Azure Synapse Analytics 中的專用 SQL 集區之間可重試的共用連線錯誤目錄,請參閱 Built-in transient error list。

選擇一個配置路徑

任務 文章
在程式碼中建立並指派一個提供者 在 SqlClient 中設定重試邏輯
比較固定、增量、指數及無重試服務提供者 SqlClient 中的內建重試邏輯提供程式
在設定檔中設定全應用程式的預設值 用設定檔配置 SqlClient 重試邏輯
實作自訂間隔、錯誤判斷條件或提供者 為 SqlClient 建立自訂重試提供者

設計安全的重試政策

  • 僅重試那些不必變更應用程式輸入、且可能自行排除的失敗。
  • 重試次數和最大延遲都受到限制。 無界重試迴路可以將停電變成持續負載。
  • 將 NumberOfTries 視為包括初始操作在內的總嘗試次數。
  • 加入抖動,避免多個用戶端同時重試。 內建提供者會自動加入抖動。
  • 重試整個交易,而不是裡面的一個語句。 內建的指令提供者不會在有活躍交易的連線上重試指令。
  • 將指令重試限制於冪等作業,或限制於受應用程式層級冪等機制保護的作業。
  • Retrying記錄事件,這樣你才能區分恢復的短暫故障和持續發生的事件。

一般架構指引請參見 重試模式。 關於 Azure SQL 錯誤指引,請參閱 Transient errors.

客戶端逾時與無伺服器恢復

CRL 只重試驅動程式實際收到的錯誤。 用戶端逾時會顯示為錯誤 -2,其不在 內建的暫態錯誤清單中,因此內建的提供者不會重試 Open(),也不會重試遇到用戶端逾時的命令。 ConnectTimeout 和 CommandTimeout 必須夠長,才能各自單獨涵蓋整個操作。

這個條件對於啟用自動暫停的 Azure SQL Database 無伺服器計算層來說尤其重要。 自動暫停的資料庫會在第一次Open()時恢復,而恢復作業可能需要 30 到 60 秒甚至更久。 當目標能自動暫停時,時間至少提升 ConnectTimeout 到60秒。 重試邏輯接著處理剩餘的暫態故障(例如 40613、 40197、 40501和 ),同時資料庫會上線。