NuGet パッケージのPollyを利用して、フェールオーバー SQL 例外をトラップする再試行ロジックを実装しています。Azure で SQL Server Always On High Availability をセットアップしています。
すべての SQL 例外 (正しくない) をトラップするのではなく、フェイルオーバーが発生したときに発生する特定の SQL 例外をトラップしたいと考えています。
SSMS からダッシュボードを表示すると、人為的にフェイルオーバーをトリガーしてコードをテストできます。最初は、すべての例外をバブル オーバーさせていました (つまり、トラッピングはありません)。次に、フェイルオーバーをキューに入れ、ログを見て、発生した SQL 例外を確認します。その後、フェイルオーバーによって発生していたすべての SQL 例外をトラップできるようになりました。
私の質問は、それは包括的なリストですか? SQL Server フェールオーバーで再試行ロジックを実装した他の人は、他の SQL 例外をトラップしますか?
ロジックを使用して 100 回近くのフェイルオーバーを試みましたが、何も発生しませんでした。これは、Failover SQL Exceptions のすべてをキャプチャしたという意味ではありません。
再試行ロジックには Policy.Handle(se => IsFailoverSqlException(se)) があります。フェイルオーバーがキューに入れられたときのコード内の場所に応じて、以下にトラップする 3 つの SQL 例外が表示されます。
private static bool IsFailoverSqlException(SqlException se)
{
return (
/*
A network-related or instance-specific error occurred while establishing a connection to SQL Server.
The server was not found or was not accessible.
Verify that the instance name is correct and that SQL Server is configured to allow remote connections.
*/
(se.Class == 20 && se.State == 0 && se.Number == 53) ||
/*
Failed while logging Fatal to MT Database: Unable to access availability database 'MedicusMT' because the database replica is not in the PRIMARY or SECONDARY role.
Connections to an availability database is permitted only when the database replica is in the PRIMARY or SECONDARY role.
Try the operation again later.
*/
(se.Class == 14 && se.State == 1 && se.Number == 983) ||
// A transport-level error has occurred when receiving results from the server. (provider: Session Provider, error: 19 - Physical connection is not usable)
(se.Class == 20 && se.State == 0 && se.Number == -1)
);
}