Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: .NET Framework
.NET .NET
Standard
Microsoft.Data.SqlClient.SqlConfigurableRetryFactory erstellt Provider für gängige Wiederholungszeitpläne. Konfigurierbare Wiederholungslogik ist standardmäßig deaktiviert. Weisen Sie SqlConnection.RetryLogicProvider oder SqlCommand.RetryLogicProvider einen Anbieter zu, um es für das Objekt zu aktivieren.
Wählen Sie einen Anbieter für Wiederholungen
| Werksmethode | Verzögerungsmuster |
|---|---|
| SqlConfigurableRetryFactory.CreateFixedRetryProvider | Ungefähr die gleiche Verzögerung vor jedem erneuten Versuch. |
| SqlConfigurableRetryFactory.CreateIncrementalRetryProvider | Fügt DeltaTime zur Verzögerung nach jedem Wiederholungsversuch hinzu. |
| SqlConfigurableRetryFactory.CreateExponentialRetryProvider | Erhöht die Verzögerung nach jedem erneuten Versuch exponentiell. |
| SqlConfigurableRetryFactory.CreateNoneRetryProvider | Versucht es nicht erneut. Dieser Anbieter ist der Standardanbieter. |
Die festen, inkrementellen und exponentiellen Anbieter fügen jedem Intervall zufällige Jitter hinzu. Jitter reduziert synchronisierte Häufungen von Wiederholungsversuchen, wenn viele Clients von demselben Ausfall betroffen sind.
NumberOfTries ist die Gesamtzahl der Versuche, einschließlich der anfänglichen Operation. Zum Beispiel NumberOfTries = 3 erlaubt er den ersten Versuch und bis zu zwei Wiederholungen. Ihr gültiger Bereich liegt zwischen 1 und 60.
Eingebaute transiente Fehlerliste
Wenn SqlRetryLogicOption.TransientErrors auf null festgelegt ist, wiederholen die integrierten Anbieter die 20 Fehlernummern in SqlConfigurableRetryFactory.BaselineTransientErrors, gruppiert danach, wo der Fehler auftritt:
| Fehlerbereich | Fehlernummern |
|---|---|
| Transport des Login-Prozesses |
233, 997, 10060 |
| Datenbankverfügbarkeit während des Logins |
4060, 4221 |
| Anweisungs-Ebene |
1204, 1205, 1222 |
| Ressourcenbegrenzung oder Drosselung |
10928, 10929, 40501, 49918, , 49919, 49920 |
| Azure SQL-Dienstfailover |
40143, 40197, 40540, 40613 |
| Dedizierter SQL-Pool-Zustand |
42108, 42109 |
Jeder Fehler wird in den folgenden Abschnitten beschrieben.
Von Bedeutung
Die Einstellung TransientErrors ersetzt die eingebaute Liste. Es wird nicht an die Liste angehängt. Fügen Sie jeden Fehler hinzu, den der Anbieter überprüfen sollte.
In Microsoft.Data.SqlClient 7.0 stellt SqlConfigurableRetryFactory.BaselineTransientErrors die integrierte Liste als schreibgeschützte Sammlung bereit. Verwenden Sie es, um die Baseline zu erweitern, ohne Fehlernummern aus der Treiberquelle zu kopieren:
var transientErrors = SqlConfigurableRetryFactory.BaselineTransientErrors
.Append(12345)
.ToArray();
var options = new SqlRetryLogicOption
{
NumberOfTries = 5,
DeltaTime = TimeSpan.FromSeconds(2),
MaxTimeInterval = TimeSpan.FromSeconds(30),
TransientErrors = transientErrors,
};
Für frühere Treiberversionen erstellen Sie eine applikationseigene Sammlung, die die benötigten Basisfehler und Ihre zusätzlichen Fehler enthält. Bevor Sie eine Basislinie kopieren, wählen Sie das SqlClient-Quelltag aus, das Ihrer installierten Paketversion entspricht, und überprüfen Sie SqlConfigurableRetryFactory.cs. Die Liste in der Filiale main kann sich ändern, nachdem dein Paket freigegeben wurde.
Fehler beim Verbindungsaufbau
Die folgenden Fehler können in der integrierten Liste erneut versucht werden oder es lohnt sich, sie zusätzlich zur integrierten Liste in TransientErrors aufzunehmen.
Die folgenden Fehler können vorübergehend auftreten, wenn sie während der Verbindungsaufnahme oder beim Senden einer Anfrage an den Server auftreten. Versuchen Sie es mit einem kurzen, begrenzten Backoff. Fehler, die auch nach einigen Wiederholungen bestehen bleiben, deuten meist auf ein Konfigurationsproblem hin, wie einen falschen Server, fehlende Berechtigungen, inkompatible Verschlüsselungseinstellungen oder eine erschöpfte Quote, die ein erneuter Versuch nicht beheben kann.
| Fehler | Fehlertyp | Meldung | Troubleshooting |
|---|---|---|---|
64 |
Transport während der Anmeldung | A connection was successfully established with the server, but then an error occurred during the login process. (provider: TCP Provider, error: 0 - The specified network name is no longer available.) |
Die TCP-Verbindung bricht während des Handshakes ab. Kein Anmeldeinformationsfehler. Wenn er weiterhin besteht, suchen Sie nach clientseitiger Netzwerkinstabilität oder einem Zwischengerät, das halb etablierte Verbindungen abbricht. |
233 |
Pre-Login-Transport oder TLS | The client was unable to establish a connection because of an error during connection initialization process before login. |
Der Server gibt diesen Fehler häufig zurück, wenn er die Verbindung aufgrund von Ressourcenerschöpfung, einer Verbindungsbegrenzung oder eines nicht unterstützten Clients nicht akzeptieren kann. Kein Anmeldeinformationsfehler. Überprüfen Sie den Serverzustand und prüfen Sie dann die Anmeldezeitüberschreitung des Clients, die TLS-Einstellungen und die TLS-Version-Kompatibilität zwischen Client und Server. |
4060 |
Datenbankverfügbarkeit oder -zugriff | Cannot open database "%.*ls" requested by the login. The login failed. |
Die Anmeldung authentifiziert sich, kann die angeforderte Datenbank aber nicht öffnen. Vorübergehende Ursachen sind unter anderem, dass sich die Datenbank in einem Übergangszustand befindet (Failover, Wiederherstellung, Skalierung) oder automatisch angehalten wurde. Persistente Ursachen (Datenbank ist nicht vorhanden, Anmeldezugriff fehlt) werden nicht durch Wiederholung behoben. Überprüfen Sie den Datenbanknamen, die Anmeldezuordnung und den Datenbankstatus. |
4221 |
Lesbarer sekundärer Übergang | Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. |
Das Replikat steht zur Anmeldung nicht zur Verfügung, weil Zeilenversionen für Transaktionen fehlen, die beim Neustarten des Replikats in Verarbeitung waren. Führen Sie auf dem Primärserver ein Rollback oder Commit der aktiven Transaktionen durch, um das Problem zu beheben. Abhilfe schaffen Sie, indem Sie lange Schreibtransaktionen auf der Primärinstanz vermeiden. |
10053 |
Lokalverkehrsabbruch | A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An established connection was aborted by the software in your host machine.) |
Die lokale Seite bricht die Verbindung ab. Überprüfen Sie die clientseitige Netzwerkintegrität und alle lokalen Firewalls oder VPN-Clients. |
10054 |
Ferntransport-Reset | A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.) |
Die Remoteseite sendet einen TCP-Reset. Häufige Ursachen: der Peerprozess ist abgestürzt, eine Firewall hat ein Reset-Paket gesendet, oder das Azure SQL-Gateway hat eine inaktive Verbindung geschlossen. Aktivieren Sie für Idle-Reset-Muster TCP-Keepalive auf dem Client, oder kürzen Sie das Leerlauftimeout für den Verbindungspool. |
10060 |
Verbindungstimeout | A connection attempt failed because the connected party did not properly respond after a period of time. |
Der Server oder ein zwischengeschaltetes Netzwerkgerät hat nicht geantwortet, bevor das Zeitlimit für die TCP-Verbindung ablief. Überprüfen Sie die Serverzustand, das Routing, die Firewall-Regeln und ob der konfigurierte Host und Port erreichbar sind. |
10928 |
Datenbankressourcengrenze | Resource ID: %d. The %s limit for the database is %d and has been reached. |
Die Datenbank überschreitet einen Grenzwert der Azure SQL-Ressourcensteuerung. Ressourcen-ID 1 gibt den Arbeitsgrenzwert an; Die Ressourcen-ID 2 gibt den Sitzungsgrenzwert an. Ermitteln Sie anhand der Meldung die Art der Begrenzung, und verringern Sie dann die Parallelität, skalieren Sie die Datenbank hoch, oder verkürzen Sie lang andauernde Vorgänge, die die Ressource belegen. |
10929 |
Datenbank-Drosselung | Resource ID: %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. However, the server is currently too busy to support requests greater than %d for this database. |
Die Datenbank überschreitet ihre Mindestgarantie, und der zugrunde liegende Server drosselt die Leistung. Der Wiederholvorgang ist in der Regel erfolgreich, wenn die benachbarte Last abnimmt. Dauerhafte Vorkommen deuten darauf hin, dass Sie eine höhere Dienstebene oder eine weniger laute Umgebung benötigen. |
40020, 40143, 40166, 40540 |
Azure SQL-Failover-Untercode | Gemeldet im Error code %d-Slot von Fehler 40197 während des Failovers. |
In eine 40197-Failovermeldung eingebettete Untercodes, die in einigen Pfaden als Fehlernummer auf oberster Ebene erscheinen. Behandeln Sie sie genauso wie 40197. |
40197 |
Azure SQL failover | The service has encountered an error processing your request. Please try again. Error code %d. |
Ein Softwareupgrade, Hardwarefehler oder ein anderes Failoverereignis in Azure SQL. Durch erneutes Verbinden werden Sie zu einem fehlerfreien Replikat weitergeleitet. Der eingebettete Fehlercode identifiziert den Failovertyp. Wenn der Fehler weiterhin besteht, erfassen Sie die Sitzungsablaufverfolgungs-ID, und wenden Sie sich an den Support. |
40501 |
Azure SQL-Drosselung | The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. |
Drosselung der Azure SQL-Datenbank-Engine Die empfohlene Untergrenze für die Wartezeit beträgt 10 Sekunden. Anhaltende Drosselung weist darauf hin, dass der Workload die Ressourcenzuweisung der Datenbank überschritten hat; skalieren Sie die Dienstebene hoch oder reduzieren Sie die Parallelität. |
40613 |
Datenbank nicht verfügbar | Database '%.*ls' on server '%.*ls' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them with the session tracing ID of '%.*ls'. |
Die Datenbank ist nicht verfügbar, in der Regel mitten im Failover oder kurz während eines Skalierungsvorgangs. Versuchen Sie es nach einer Wartezeit erneut; wenn das Problem nach einigen Minuten weiterhin besteht, notieren Sie die Ablaufverfolgungs-ID der Sitzung, und eröffnen Sie einen Supportfall. |
42108 |
SQL-Pool pausiert | Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. |
Der dedizierte SQL-Pool (Synapse) befindet sich in einem angehaltenen Zustand. Der Wiederholungsversuch ist erst erfolgreich, nachdem der Pool wiederaufgenommen wurde. Nehmen Sie den Pool explizit wieder auf, oder planen Sie die Workload so, dass sie erst nach der Wiederaufnahme des Pools ausgeführt wird. |
42109 |
Wiederaufnahme des SQL-Pools | The SQL pool is warming up. Please try again. |
Der dedizierte SQL-Pool wird wieder aufgenommen. Wiederholen Sie einen Backoff, bis der Pool online ist. Das Aufwärmen dauert in der Regel ein paar Minuten. |
49918 |
Mangel an Serviceressourcen | Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. |
Der Server kann derzeit nicht genügend Ressourcen zuordnen, um die Anforderung zu erfüllen. Wiederholen Sie den Vorgang nach einer gewissen Wartezeit. Wenn der Fehler weiterhin besteht, skalieren Sie die Datenbank oder den elastischen Pool. |
49919 |
Drosselung von Verwaltungsvorgängen | Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". |
Parallelitätsgrenze auf Abonnementebene bei Verwaltungsvorgängen. Reduzieren Sie parallele Erstellungs-/Aktualisierungsaufrufe oder führen Sie sie gestaffelt aus. |
49920 |
Drosselung von Abonnementvorgängen | Cannot process request. Too many operations in progress for subscription "%ld". |
Parallelitätsgrenzwert auf Abonnementebene für In-Flight-Vorgänge. Reduzieren Sie die Parallelität, oder warten Sie, bis die In-Flight-Vorgänge abgeschlossen sind. |
Fehler auf Anweisungsebene befinden sich nicht in dieser Liste, da sie ausgelöst werden, nachdem die Verbindung hergestellt wurde und der Fehler die Sitzung nutzbar lässt. Die häufigsten Fehler bei Anweisungen, die erneut ausgeführt werden können, sind 1205 (Deadlock-Opfer) und 1222 (Zeitüberschreitung bei der Sperranforderung). Wiederholen Sie die gesamte Transaktion statt der einzelnen fehlerhaften Anweisung.
Fehlermeldungstext stammt aus Azure SQL vorübergehenden Verbindungsfehlern. Diese Fehler sind für Wiederholungen in SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric und dedizierten SQL-Pools in Azure Synapse Analytics zugelassen.
Fehler während der Befehlsausführung
Die folgenden Fehler treten auf, nachdem eine Verbindung hergestellt wurde, während ein Befehl ausgeführt wird. Versuchen Sie die gesamte Transaktion erneut, nicht die individuelle Kontoausrechnung. Die Wiederholung einer Anweisung innerhalb einer Transaktion kann dazu führen, dass frühere Arbeit dupliziert wird oder die Reihenfolgegarantien der Transaktion verletzt werden.
| Fehler | Fehlertyp | Meldung | Troubleshooting |
|---|---|---|---|
1204 |
Sperrressource aufgebraucht | The instance of the SQL Server Database Engine cannot obtain a LOCK resource at this time. Rerun your statement when there are fewer active users. Ask the database administrator to check the lock and memory configuration for this instance, or to check for long-running transactions. |
Der Lock-Manager kann keine weiteren Lock-Ressourcen auf dem Server zuweisen. Die Transaktion rückgängig machen und nach einem kurzen Rückzug erneut versuchen. Anhaltende Vorkommnisse deuten auf Konflikte oder Speicherdruck hin, den Skalierung oder Abfrageoptimierung adressieren muss. |
1205 |
Deadlock-Opfer | Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. |
Die Engine hat diese Sitzung ausgewählt, um einen Deadlock aufzulösen, und ihre Transaktion zurückgerollt. Machen Sie clientseitig ein Rollback, um verbleibende Zustandsinformationen freizugeben, und versuchen Sie anschließend die gesamte Transaktion erneut. |
1222 |
Zeitüberschreitung der Sperranforderung | Lock request time out period exceeded. |
Die Engine gab auf, auf ein Schloss zu warten. Wiederholen Sie die Transaktion nach einer kurzen Wartezeit. Wiederholtes Auftreten deutet auf Blockierungen hin, die durch Indexierung, Abfrageoptimierung oder SET LOCK_TIMEOUT Prüfung behoben werden müssen. |
3960 |
Updatekonflikt bei der Snapshotisolation | Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table '%.*ls' directly or indirectly in database '%.*ls' to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement. |
Zwei Transaktionen, die unter Snapshot-Isolation laufen, versuchten, dieselbe Zeile zu aktualisieren. Der Motor brach diese Transaktion ab. Wiederholen Sie die gesamte Transaktion, oder ändern Sie die Isolationsstufe für den konfliktbehafteten Schreibvorgang. Fügen Sie eine benutzerdefinierte Liste von vorübergehenden Fehlern hinzu, wenn Ihre Anwendung Snapshot-Isolation verwendet. |
Fehler auf Anweisungsniveau, die ein Batch- oder Schemaproblem widerspiegeln (zum Beispiel 102 Syntaxfehler, 207 ungültige Spalte, 2812 fehlende gespeicherte Prozedur), sind nicht vorübergehend. Beheben Sie den Abfragetext oder die Schema-Bindung; Ein erneuter Versuch hilft nicht.
Der Fehlermeldungstext stammt aus der sys.messages-Katalogansicht . Diese Fehler stammen vom SQL Server-Datenbankmodul, daher sind ihre Nummern in SQL Server, Azure SQL-Datenbank, Azure SQL Managed Instance, SQL-Datenbank in Microsoft Fabric und dedizierten SQL-Pools in Azure Synapse Analytics unabhängig vom Treiber identisch.
Der Treiber, nicht die Engine, gibt clientseitige Darstellungen von Fehlern aufgrund von Anweisungszeitüberschreitungen und Abbrüchen aus (z. B. das Microsoft.Data.SqlClient-Timeout -2), sodass diese Fehler nicht in der integrierten Liste enthalten sind. Wenn Ihre Anwendung diese Fehler separat erkennt, behandeln Sie sie an derselben Transaktionsgrenze wie die zuvor beschriebenen Engine-Fehler.
Befehls- und Transaktionsverhalten
Die integrierten Anbieter überspringen den Wiederholungsversuch, wenn ein Befehl innerhalb eines TransactionScope ausgeführt wird oder ihm ein SqlTransaction zugeordnet ist. Der Befehl läuft einmal ohne Logik für einen erneuten Versuch. Die Wiederholung einer einzelnen Anweisung innerhalb einer Transaktion kann dazu führen, dass frühere Aktionen dupliziert werden oder die beabsichtigte Reihenfolge der Transaktion verletzt wird.
Vorsicht
Bei Deadlocks und anderen Fehlern, die einen erneuten Versuch innerhalb einer Transaktion erlauben, rollen Sie die gesamte Transaktion als Ganzes zurück und wiederholen Sie sie. Versuche es nicht nur mit dem fehlschlagenden Befehl erneut.
Verwenden Sie SqlRetryLogicOption.AuthorizedSqlCondition, um Wiederholungen von Befehlen auf Vorgänge zu beschränken, die Ihre Anwendung sicher wiederholen kann. Das Prädikat erhält den Befehlstext. Wenn das Prädikat zurückgibt false, wird der Befehl einmal ohne Retry-Logik ausgeführt.
Beispiel
Für vollständige Verbindungs- und Befehlsbeispiele siehe: