SqlClient の構成可能な再試行ロジック

適用対象: .NET Framework .NET .NET Standard

ADO.NET のダウンロード

構成可能な再試行ロジック (CRL) により、Microsoft.Data.SqlClient は一時的な障害の発生後に、選択された SqlConnection および SqlCommand 操作を再試行できます。 どのエラーを対象にするか、何回試みするか、遅延の増大、そしてどのコマンドが安全に繰り返せるかを選びます。

CRLはデフォルトでオフになっています。 接続やコマンド、またはその両方にプロバイダーを割り当てることで有効化します。 この2つのプロバイダーは独立しており、プロバイダーを接続に割り当てても、その接続から作成されたコマンドには適用されません。

CRLはMicrosoftで利用可能です。Data.SqlClient 3.0以降のバージョンです。 デフォルトは SqlConfigurableRetryFactory.CreateNoneRetryProviderで、リトライはしません。

CRL が再試行する項目

Scenario プロバイダーを に割り当てる 典型的な故障
接続を開けてください SqlConnection.RetryLogicProvider フェイルオーバー、スロットリング、データベースの一時的な利用不可、接続確立時のトランスポート障害。
コマンドを実行する SqlCommand.RetryLogicProvider トランザクション外で再実行しても安全な、一部のステートメントの失敗。

SQL Server、Azure SQL Database、Azure SQL Managed Instance、Microsoft Fabric の SQL データベース、Azure Synapse Analytics の専用 SQL プールで再試行の対象となる接続エラーの共通カタログについては、Built-in transient error list を参照してください。

構成パスを選ぶ

Task [アーティクル]
コードでプロバイダーを作成・割り当て SqlClientでリトライロジックを設定
固定プロバイダー、インクリメンタルプロバイダー、指数関数プロバイダー、ノーリトライプロバイダーを比較してください SqlClientに組み込まれたリトライロジックプロバイダ
設定ファイルでアプリケーション全体のデフォルトを設定します 設定ファイルでSqlClientの再試行ロジックを設定する
カスタム間隔、誤差述語、またはプロバイダーを実装します SqlClient用のカスタムリトライプロバイダーを作成してください

安全な再挑戦ポリシーを設計する

  • アプリケーション入力を変えずにクリアされそうな失敗だけを再試行してください。
  • 試行回数と最大遅延の両方でリトライが制限されます。 無制限の再試行ループは、障害を持続的な負荷に変えることができます。
  • NumberOfTriesを初回の操作を含む試行回数の合計とみなします。
  • ジッターを追加して、多くのクライアントが同時に再試行しないようにしましょう。 組み込みプロバイダーは自動的にジッターを追加します。
  • 取引全体をやり直し、中の一文だけをやり直すのではなく。 組み込みのコマンドプロバイダーは、アクティブなトランザクションがある接続でコマンドをやり直すことはありません。
  • コマンドリトライは冪等演算、またはアプリケーションレベルの冪等性メカニズムで保護された演算に限定します。
  • Retryingイベントを記録して、回復した一時的な障害と持続的なインシデントを区別しましょう。

一般的なアーキテクチャのガイダンスについては、 Retry patternを参照してください。 Azure SQL エラーガイダンスについては、Transient errors を参照してください。

クライアント側タイムアウトとサーバーレス履歴書

CRLはドライバーが実際に受け取るエラーのみをリトライします。 クライアント側のタイムアウトはエラー -2として現れますが、 これは組み込みの一時的エラーリストには含まれていないため、組み込みのプロバイダーはクライアントのタイムアウトに当たる Open() やコマンドを再試行しません。 ConnectTimeout そして CommandTimeout は単独で作戦をカバーできるほどの長さでなければなりません。

この条件は、自動一時停止が有効化されたAzure SQL DatabaseのServerlessコンピュート層で特に重要です。 自動一時停止されたデータベースは最初の Open()で再開され、履歴書には30秒から60秒以上かかることがあります。 ターゲットが自動停止できる ConnectTimeout は少なくとも60秒に上げてください。 その後、リトライロジックが残りの過渡的な故障(例: 406134019740501)を処理し、データベースがオンライン化します。