sql >> Databáze >  >> RDS >> Sqlserver

Občas získávání SqlException:Vypršel časový limit

Musíte to prozkoumat na straně serveru, abyste pochopili, proč vypršel časový limit provádění. Všimněte si, že server nemá žádný časový limit, časový limit je způsoben výchozími 30 sekundami na SqlCommand.CommandTimeout .

Dobrým zdrojem je Čekání a fronty , což je metodika pro diagnostiku slabých míst výkonu s SQL Server. Na základě skutečné příčiny časového limitu lze podniknout náležité kroky. Nejprve musíte zjistit, zda máte co do činění s pomalým prováděním (špatný plán) nebo blokováním.

Pokud bych se odvážil hádat, řekl bych, že nezdravý vzorec IF EXISTS... UPDATE je hlavní příčinou. Tento vzor je nesprávný a způsobí selhání při souběžnosti. Dvě souběžné transakce provádějící IF EXISTS současně oba dosáhnou stejného závěru a obojí pokuste se INSERT nebo UPDATE . V závislosti na výstupních omezeních v databázi můžete skončit se zablokováním (šťastný případ) nebo se ztraceným zápisem (nešťastný případ). Skutečnou základní příčinu však odhalí pouze řádné vyšetření. Může to být něco úplně jiného, ​​například události automatického růstu .

Váš postup také nesprávně zpracovává blok CATCH. Musíte vždy zkontrolujte XACT_STATE() protože transakce může být již vrácena zpět v době, kdy běží váš blok CATCH. Také není jasné, co očekáváte od pojmenování transakce, je to běžná chyba, kterou často vidím spojenou se záměnou pojmenovaných transakcí s body uložení. Správný vzor naleznete v části Zpracování výjimek a vnořené transakce .

Upravit

Zde je možný způsob, jak to prozkoumat:

  1. Změňte relevantní CommandTimeout na 0 (tj. nekonečno).
  2. Povolte blocked process threshold , nastavte jej na 30 sekund (dříve CommandTimeout)
  3. Sledujte v Profileru Událost zprávy o zablokovaném procesu
  4. Začněte svou pracovní zátěž
  5. Podívejte se, zda Profiler vytváří nějaké události hlášení. Pokud ano, určí příčinu.

Tyto akce způsobí událost „zpráva o zablokovaném procesu“ pokaždé, když by došlo k vypršení časového limitu, pokud byl časový limit způsoben zablokováním. Vaše aplikace bude i nadále čekat, dokud nebude blokování odstraněno, pokud je blokování způsobeno živý zámek pak to bude čekat navždy.



  1. System.Data.OracleClient vyžaduje klientský software Oracle verze 8.1.7 nebo vyšší

  2. SQL - Odečtení vyčerpávající hodnoty od řádků

  3. Laravel 5.1 - Kontrola připojení k databázi

  4. Chyba MySQL 1241:Operand by měl obsahovat 1 sloupec (sloupce)