Du skal undersøge dette på serversiden for at forstå, hvorfor eksekveringen udløber. Bemærk, at serveren ikke har nogen timeout, timeout er forårsaget af standard 30 sekunder på SqlCommand.CommandTimeout
.
En god ressource er Venter og køer , som er en metode til at diagnosticere ydeevneflaskehalse med SQL Server. Baseret på den faktiske årsag til timeout, kan der træffes passende foranstaltninger. Du skal først og fremmest fastslå, om du har at gøre med langsom eksekvering (en dårlig plan) eller blokering.
Hvis jeg ville vove et gæt, ville jeg sige, at det usunde mønster IF EXISTS... UPDATE
er grundårsagen. Dette mønster er forkert og vil forårsage fejl under samtidighed. To samtidige transaktioner, der udfører IF EXISTS
samtidig vil begge nå frem til den samme konklusion og begge forsøg at INSERT
eller UPDATE
. Afhængigt af de afsluttende begrænsninger i databasen kan du ende med et dødvande (det heldige tilfælde) eller med en tabt skrivning (det uheldige tilfælde). Men kun en ordentlig undersøgelse ville afsløre den egentlige årsag. Kunne være noget helt andet, såsom begivenheder med automatisk vækst
.
Din procedure håndterer også CATCH-blokken forkert. Du skal altid tjek XACT_STATE()
fordi transaktionen muligvis allerede er rullet tilbage, når din CATCH-blok kører. Det er heller ikke klart, hvad du forventer af at navngive transaktionen, dette er en almindelig fejl, jeg ser ofte forbundet med at forveksle navngivne transaktioner med savepoints. For et korrekt mønster se Exception Handling and Nested Transactions
Rediger
Her er en mulig måde at undersøge dette på:
- Skift den relevante
CommandTimeout
til 0 (dvs. uendelig). - Aktiver
blocked process threshold
, indstil den til 30 sekunder (det tidligere CommandTimeout) - Overvåg i Profiler for Blokeret procesrapporthændelse
- Start din arbejdsbyrde
- Se, om Profiler producerer nogen rapporthændelser. Hvis det gør det, vil de finde årsagen.
Disse handlinger vil forårsage en 'blokeret procesrapport'-hændelse, hver gang du ville have fået en timeout, hvis timeoutet var forårsaget af blokering. Din ansøgning vil fortsætte med at vente, indtil blokeringen er fjernet, hvis blokeringen er forårsaget af en live-lock så vil det vente for evigt.