Inbyggda retry-logikleverantörer i SqlClient

Gäller för: .NET Framework .NET .NET Standard

Ladda ned ADO.NET

Microsoft.Data.SqlClient.SqlConfigurableRetryFactory Skapar vårdgivare för gemensamma omprövningsscheman. Konfigurerbar omprovningslogik är avstängd som standard. Tilldela en leverantör till SqlConnection.RetryLogicProvider eller SqlCommand.RetryLogicProvider för att aktivera den för objektet.

Välj en leverantör för omförsök

Fabriksmetod Fördröjningsmönster
SqlConfigurableRetryFactory.CreateFixedRetryProvider Ungefär samma fördröjning före varje omförsök.
SqlConfigurableRetryFactory.CreateIncrementalRetryProvider Lägger till DeltaTime till fördröjningen efter varje nytt försök.
SqlConfigurableRetryFactory.CreateExponentialRetryProvider Ökar fördröjningen exponentiellt efter varje omförsök.
SqlConfigurableRetryFactory.CreateNoneRetryProvider Försöker inte igen. Denna leverantör är standard.

De fasta, inkrementella och exponentiella leverantörerna lägger till slumpmässig jitter till varje intervall. Jitter minskar synkroniserade återförsöksburstar när många klienter råkar ut för samma avbrott.

NumberOfTries är det totala antalet försök, inklusive den initiala operationen. Till exempel NumberOfTries = 3 tillåter det första försöket och upp till två försök. Dess giltiga intervall är 1 till 60.

Inbyggd lista över övergående felmeddelanden

När SqlRetryLogicOption.TransientErrors är null, försöker de inbyggda leverantörerna igen vid de 20 felnummer som finns i SqlConfigurableRetryFactory.BaselineTransientErrors, grupperade efter var felet uppstår:

Felområde Felnummer
Inloggningsprocesstransport 233, 997, 10060
Databastillgänglighet under inloggning 4060, 4221
På instruktionsnivå 1204, 1205, 1222
Resursbegränsning eller strypning 10928, 10929, 40501, 49918, , 49919, 49920
Redundansväxling för Azure SQL-tjänsten 40143, 40197, 40540, 40613
Dedikerat SQL-pooltillstånd 42108, 42109

Varje fel beskrivs i de följande avsnitten.

Viktigt!

Inställning TransientErrors ersätter den inbyggda listan. Det läggs inte till i listan. Inkludera varje fel som vårdgivaren bör försöka om.

I Microsoft.Data.SqlClient 7.0 gör SqlConfigurableRetryFactory.BaselineTransientErrors den inbyggda listan tillgänglig som en skrivskyddad samling. Använd den för att utöka baslinjen utan att kopiera felnummer från drivrutinskällan:

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 tidigare drivrutinsversioner, skapa en applikationsägd samling som innehåller de grundläggande fel du behöver och dina ytterligare fel. Innan du kopierar en baslinje, välj SqlClient-källtaggen som matchar din installerade paketversion och inspektera SqlConfigurableRetryFactory.cs. Listan på filialen main kan ändras efter att ditt paket släppts.

Fel vid anslutningsetablering

Följande fel kan försökas igen i den inbyggda listan eller är värda att lägga till i TransientErrors utöver den inbyggda listan.

Följande fel kan vara tillfälliga när de uppstår vid anslutningsetablering eller när en förfrågan skickas till servern. Försök igen på en kort, begränsad backoff. Fel som kvarstår efter några omförsök indikerar vanligtvis ett konfigurationsproblem, såsom fel server, saknade behörigheter, inkompatibla krypteringsinställningar eller uttömda kvoter, som omprövningar inte löser.

Error Feltyp Message Troubleshooting
64 Transport vid inloggning 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.) TCP-anslutningen bryts mitt under handskakningen. Inte ett autentiseringsfel. Om det kvarstår, kontrollera om det finns instabilitet i nätverket på klientsidan eller en mellanliggande enhet som bryter halvetablerade anslutningar.
233 Transport före inloggning eller TLS The client was unable to establish a connection because of an error during connection initialization process before login. Servern returnerar ofta detta fel när den inte kan acceptera anslutningen på grund av resursbrist, en anslutningsgräns eller en klient som inte stöds. Inte ett autentiseringsfel. Kontrollera serverns hälsotillstånd och kontrollera sedan tidsgränsen för klientinloggning, TLS-inställningar och kompatibiliteten för klient-/server-TLS-versionen.
4060 Databastillgänglighet eller åtkomst Cannot open database "%.*ls" requested by the login. The login failed. Inloggningen autentiserar men kan inte öppna den begärda databasen. Tillfälliga orsaker kan vara att databasen är i en övergångsfas (redundansväxling, återställning, skalning) eller har pausats automatiskt. Beständiga orsaker (databasen finns inte, inloggningen saknar åtkomst) kommer inte att åtgärdas genom ett nytt försök. kontrollera databasnamnet, inloggningsmappningen och databastillståndet.
4221 Läsbar sekundär övergång Login to read-secondary failed due to long wait on 'HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING'. Repliken är inte tillgänglig för inloggning eftersom radversioner saknas för transaktioner som kördes när repliken återvanns. Återställ eller genomför de aktiva transaktionerna på primärservern för att lösa problemet. Minska risken genom att undvika långa skrivtransaktioner på primärnoden.
10053 Lokalt transportavbrott 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.) Den lokala sidan avbryter anslutningen. Kontrollera nätverkshälsa på klientsidan och eventuell lokal brandvägg eller VPN-klient.
10054 Återställning av fjärrtransport 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.) Fjärrsidan skickar en TCP-återställning. Vanliga orsaker: peer-processen kraschade, en brandvägg injicerade en återställning eller Azure SQL gateway stängde en inaktiv anslutning. Vid återkommande återställningar efter inaktivitet aktiverar du TCP-keepalive på klienten eller förkortar anslutningspoolens tidsgräns för inaktivitet.
10060 Tidsgräns för anslutning A connection attempt failed because the connected party did not properly respond after a period of time. Servern eller en mellanliggande nätverksenhet svarade inte innan TCP-anslutningens timeout. Kontrollera serverns status, routning, brandväggsregler och om den konfigurerade värden och porten kan nås.
10928 Databasresursgräns Resource ID: %d. The %s limit for the database is %d and has been reached. Databasen överskrider en Azure SQL resursstyrningsgräns. Resurs-ID 1 anger arbetsgränsen. Resurs-ID 2 anger sessionsgränsen. Identifiera gränstypen från meddelandet och minska sedan samtidigheten, skala upp databasen eller förkorta långvariga åtgärder som innehåller resursen.
10929 Databasbegränsning 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. Databasen överskrider sin garanterade miniminivå och den underliggande servern stryper prestandan. Återförsöket lyckas vanligtvis när grannbelastningen sjunker. Ihållande förekomster indikerar att du behöver en högre tjänstnivå eller en mindre bullrig miljö.
40020, 40143, 40166, 40540 Azure SQL failover-underkod Rapporteras i platsen Error code %d för fel 40197 vid redundansväxling. Underkoder som ingår i ett 40197-failovermeddelande och som i vissa fall visas som felkod på toppnivå. Behandla dem på samma sätt som 40197.
40197 Azure SQL failover The service has encountered an error processing your request. Please try again. Error code %d. En programvaruuppgradering, maskinvarufel eller annan redundanshändelse i Azure SQL. När du återansluter dirigeras du till en felfri replik. Den inbäddade felkoden identifierar redundanstypen. Om felet kvarstår samlar du in sessionsspårnings-ID:t och kontaktar supporten.
40501 Azure SQL throttling The service is currently busy. Retry the request after 10 seconds. Incident ID: %ls. Code: %d. Begränsning i Azure SQL-databasmotorn Den rekommenderade miniminivån är en väntetid på 10 sekunder. Ihållande strypning indikerar att arbetsbelastningen översteg databasens resursallokering; Skala upp tjänstenivån eller minska samtidigheten.
40613 Databasen är inte tillgänglig 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'. Databasen är inte tillgänglig, vanligtvis under en redundansväxling eller en kort stund under en skalningsåtgärd. Försök igen vid en backoff; Om det kvarstår efter några minuter samlar du in sessionsspårnings-ID:t och öppnar ett supportärende.
42108 SQL-pool pausad Can not connect to the SQL pool since it is paused. Please resume the SQL pool and try again. Den dedikerade SQL-poolen (Synapse) är i pausat tillstånd. Återförsöket lyckas först när poolen har återupptagits. Återuppta poolen uttryckligen, eller schemalägg arbetsbelastningen så att den körs efter att poolen har återupptagits.
42109 SQL-pool återupptar The SQL pool is warming up. Please try again. Den dedikerade SQL-poolen håller på att återupptas. Försök igen vid en backoff tills poolen är online. uppvärmning tar vanligtvis några minuter.
49918 Brist på serviceresurser Cannot process request. Not enough resources to process request. The service is currently busy. Please retry the request later. Servern kan för närvarande inte allokera tillräckligt med resurser för att uppfylla begäran. Försök igen vid en backoff. Om felet kvarstår skalar du upp databasen eller den elastiska poolen.
49919 Begränsning av hanteringsåtgärder Cannot process create or update request. Too many create or update operations in progress for subscription "%ld". Samtidighetsgräns på prenumerationsnivå för hanteringsoperationer. Minska antalet parallella anrop för att skapa eller uppdatera, eller fördela dem över tid.
49920 Begränsning av prenumerationsåtgärder Cannot process request. Too many operations in progress for subscription "%ld". Samtidighetsgräns på prenumerationsnivå för åtgärder under flygning. Minska graden av parallellism eller vänta tills pågående åtgärder har slutförts.

Fel på instruktionsnivå finns inte i den här listan eftersom de utlöses när anslutningen har upprättats och felet lämnar sessionen användbar. De vanligaste återförsöksbara instruktionsfelen är 1205 (deadlock victim) och 1222 (tidsgräns för låsbegäran). Försök igen hela transaktionen i stället för den enda misslyckade instruktionen.

Felmeddelandetexten kommer från Azure SQL tillfälliga anslutningsfel. Dessa fel kan försökas igen i SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-databas i Microsoft Fabric och dedikerade SQL-pooler i Azure Synapse Analytics.

Fel under kommandoexekvering

Följande fel uppstår efter att en anslutning har upprättats, medan ett kommando körs. Försök igen hela transaktionen, inte det individuella kontoutdraget. Att försöka om en sats i en transaktion kan duplicera tidigare arbete eller bryta mot transaktionens ordergarantier.

Error Feltyp Message Troubleshooting
1204 Låsresursen är uttömd 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. Låshanteraren kan inte tilldela fler låsresurser på servern. Återställ transaktionen och försök igen efter en kort väntetid. Ihållande förekomster indikerar resurskonflikter eller minnesbrist som måste hanteras med skalning eller frågeoptimering.
1205 Offer för dödläge Transaction (Process ID %d) was deadlocked on %.*ls resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Motorn valde denna session för att bryta ett dödläge och rullade tillbaka sin transaktion. Rulla tillbaka på klientsidan för att släppa kvarvarande tillstånd, och försök sedan hela transaktionen igen.
1222 Tidsgräns för låsbegäran Lock request time out period exceeded. Motorn slutade vänta på ett lås. Försök att genomföra transaktionen igen efter en kort väntetid. Återkommande förekomster tyder på blockeringar som måste åtgärdas genom indexering, frågeoptimering eller SET LOCK_TIMEOUT granskning.
3960 Uppdateringskonflikt för Snapshot isolation 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. Två transaktioner som körs under snapshot-isolering försökte uppdatera samma rad. Motorn avbröt denna transaktion. Försök om hela transaktionen, eller ändra isoleringsnivån för den konfliktfyllda skrivningen. Lägg till i en anpassad lista över tillfälliga fel om din applikation använder snapshot isolation.

Satsnivåfel som speglar ett batch- eller schemaproblem (till exempel 102 syntaxfel, 207 ogiltig kolumn, 2812 saknad lagrad procedur) är inte övergående. Fixa frågetexten eller schemabindningen; Att försöka igen hjälper inte.

Felmeddelandetexten kommer från sys.messages-katalogvyn . Dessa fel kommer från SQL Server-motorn, så deras antal är desamma över SQL Server, Azure SQL Database, Azure SQL Managed Instance, SQL-databas i Microsoft Fabric och dedikerade SQL-pooler i Azure Synapse Analytics, oavsett driver.

Drivrutinen, inte motorn, visar klientsidans representationer av tidsavslutning och avbokningsfel (till exempel Microsoft. Data.SqlClient-timeout-2), så dessa fel finns inte i den inbyggda listan. Om din applikation fångar dessa fel separat, hantera dem vid samma transaktionsgräns som motorfelen som beskrivits tidigare.

Kommando- och transaktionsbeteende

De inbyggda leverantörerna gör inte omförsök när ett kommando körs inom en omgivande TransactionScope eller har en SqlTransaction kopplad till sig. Kommandot körs en gång utan omprovningslogik. Att försöka om ett enda uttalande i en transaktion kan duplicera tidigare arbete eller bryta mot transaktionens avsedda ordning.

Caution

Vid deadlocks och andra fel som kan försökas igen i en transaktion, rulla tillbaka och försök igen med hela transaktionen som en enhet. Försök inte igen med endast kommandot som misslyckades.

Använd SqlRetryLogicOption.AuthorizedSqlCondition för att begränsa kommandoförsök till operationer som din applikation säkert kan upprepa. Predikatet får kommandotexten. Om predikatet returnerar false, körs kommandot en gång utan omprovningslogik.

Example

För fullständiga exempel på anslutning och kommando, se: