Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Понякога се получава SqlException:Времето за изчакване е изтекло

Трябва да проучите това от страна на сървъра, за да разберете защо изтича времето за изпълнение. Имайте предвид, че сървърът няма изчакване, изчакването е причинено от 30 секунди по подразбиране на SqlCommand.CommandTimeout .

Добър ресурс е Чакания и опашки , което е методология за диагностициране на тесни места в производителността със SQL Server. Въз основа на действителната причина за изчакването могат да бъдат предприети подходящи действия. Трябва да установите преди всичко дали имате работа с бавно изпълнение (лош план) или с блокиране.

Ако се осмелявам да предположа, бих казал, че нездравословният модел на IF EXISTS... UPDATE е първопричината. Този модел е неправилен и ще доведе до неуспехи при паралелност. Две едновременни транзакции, изпълняващи IF EXISTS едновременно ще достигнат до едно и също заключение и и двете опит за INSERT или UPDATE . В зависимост от съществуващите ограничения в базата данни, може да се окажете в безизходица (щастливият случай) или със загубено записване (нещастният случай). Само правилното разследване обаче ще разкрие истинската първопричина. Може да е нещо съвсем различно, като събития за автоматично нарастване .

Вашата процедура също неправилно обработва блока CATCH. Трябва винаги проверете XACT_STATE() тъй като транзакцията може вече да е отменена до момента, в който се изпълни вашият блок CATCH. Също така не е ясно какво очаквате от именуването на транзакцията, това е често срещана грешка, която виждам, често свързана с объркване на наименувани транзакции с точки за запис. За правилен модел вижте Обработка на изключения и вложени транзакции .

Редактиране

Ето възможен начин да проучите това:

  1. Променете съответния CommandTimeout до 0 (т.е. безкрайно).
  2. Активирайте blocked process threshold , задайте го на 30 секунди (предишното CommandTimeout)
  3. Наблюдавайте в Profiler за Събитие за отчитане на блокиран процес
  4. Започнете работното си натоварване
  5. Вижте дали Profiler генерира някакви отчетни събития. Ако е така, те ще определят причината.

Тези действия ще предизвикат събитие „отчет за блокиран процес“ всеки път, когато ще получите изчакване, ако изчакването е било причинено от блокиране. Приложението ви ще продължи да чака, докато блокирането бъде премахнато, ако блокирането е причинено от заключване на живо тогава ще чака вечно.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използвайте FILEGROUP_NAME(), за да върнете името на файлова група в SQL Server

  2. Изпълнение на SSIS пакет с помощта на dtexec

  3. Как мога да конвертирам bigint (UNIX timestamp) в datetime в SQL Server?

  4. Как мога да се свържа със SQL Server, използвайки интегрирана защита с JDBC драйвер?

  5. Извършете анализ на продукта с помощта на пълнотекстово търсене на SQL Server. Част 1