sql >> Database >  >> RDS >> Sqlserver

Af en toe SqlException krijgen:time-out is verlopen

U moet dit aan de serverzijde onderzoeken om te begrijpen waarom de uitvoering een time-out heeft. Merk op dat de server geen time-out heeft, de time-out wordt veroorzaakt door de standaard 30 seconden op SqlCommand.CommandTimeout .

Een goede bron is Waits and Queues , een methode om prestatieknelpunten met SQL Server te diagnosticeren. Op basis van de werkelijke oorzaak van de time-out kan de juiste actie worden ondernomen. Je moet eerst en vooral vaststellen of je te maken hebt met trage uitvoering (een slecht plan) of blokkering.

Als ik een gok zou wagen, zou ik zeggen dat het ongezonde patroon van IF EXISTS... UPDATE is de oorzaak. Dit patroon is onjuist en veroorzaakt fouten bij gelijktijdigheid. Twee gelijktijdige transacties die de IF EXISTS . uitvoeren gelijktijdig zullen beide tot dezelfde conclusie komen en beide probeer INSERT of UPDATE . Afhankelijk van de bestaande beperkingen in de database, kunt u eindigen met een impasse (het gelukkige geval) of met een verloren schrijfactie (het ongelukkige geval). Alleen goed onderzoek zou echter de werkelijke oorzaak kunnen onthullen. Kan iets heel anders zijn, zoals gebeurtenissen voor automatische groei .

Uw procedure behandelt ook het CATCH-blok onjuist. Je moet altijd controleer de XACT_STATE() omdat de transactie mogelijk al is teruggedraaid tegen de tijd dat uw CATCH-blok wordt uitgevoerd. Het is ook niet duidelijk wat je verwacht van het benoemen van de transactie, dit is een veelgemaakte fout die ik vaak zie in verband met het verwarren van benoemde transacties met savepoints. Voor een correct patroon zie Afhandeling van uitzonderingen en geneste transacties .

Bewerken

Hier is een mogelijke manier om dit te onderzoeken:

  1. Wijzig de relevante CommandTimeout tot 0 (dwz oneindig).
  2. Schakel de blocked process threshold in , stel het in op 30 seconden (de voormalige CommandTimeout)
  3. Bewaken in Profiler voor Geblokkeerde procesrapportagegebeurtenis
  4. Start je werklast
  5. Kijk of de Profiler rapportgebeurtenissen produceert. Als dat zo is, zullen ze de oorzaak lokaliseren.

Deze acties zullen elke keer dat u een time-out zou krijgen, een gebeurtenis 'geblokkeerd proces rapport' veroorzaken, als de time-out werd veroorzaakt door blokkering. Je applicatie blijft wachten tot de blokkering is verwijderd, als de blokkering wordt veroorzaakt door een live-lock dan zal het voor altijd wachten.



  1. Hoe localdb afzonderlijk te installeren?

  2. TAN() Functie in Oracle

  3. mysql dynamische query in opgeslagen procedure

  4. PHP-tabel (Datum) dynamische kleurverandering op basis van geldigheid