|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
подскажите, выполняю такой запрос begin transaction WHILE (1=1) begin insert into t values(1) end commit transaction и устанавливаю CommandTimeout в 5 сек, к примеру. В итоге запрос висит до бесконечности (даже превышая дефолтовый 30 сек), а должен через 5 сек выдать ошибку Query Timeout В чем тут проблема может быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 17:04 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1, спросите на форуме по C#. SQL Server к этому не имеет отношения. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 17:11 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
точно также себя ведет sqlcmd.exe с тем же запросом при указании параметра -t <timeout> тоже зависает до бесконечности ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 17:15 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1, это в любом случае проблема клиентского приложения. Сервер как на этот параметр может повлиять? Держит, не отпускает? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 17:20 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1, где то накосячили в коде; Код: sql 1. 2. 3. 4. 5. 6.
через 5 секунд вышибает по SqlException ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 17:30 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
прикол в том, что не меняя код, а только sql-запрос на UPDATE t SET i=i+1 WHERE ... (специально заполняю таблицу на миллионы записей, чтобы выполнялся долго) - и в таком случае таймаут отрабатывает, а код тот же. странно ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 17:35 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1 прикол в том, что не меняя код, а только sql-запрос на UPDATE t SET i=i+1 WHERE ... (специально заполняю таблицу на миллионы записей, чтобы выполнялся долго) - и в таком случае таймаут отрабатывает, а код тот же. странно Прикол в том, что надо бы учиться думать. 1. Как клиент определяет "жив сервер и запрос или мертв?" 2. Просто и незатейливо: "сервер НИЧЕГО не передает на клиента". 3. Откуда следует незатейливый вывод: Код: sql 1. 2. 3. 4. 5. 6. 7.
и будет тебе таймаут. Или Код: sql 1. 2.
и НЕ будет тебе таймаута. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:10 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
да, думал над этим и пробовал с NOCOUNT ON - результат увы, тот же самый ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:16 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
вот для запуска через IE, Javascript результат тот же - зависает намертво <script> let objConnection = new ActiveXObject("ADODB.Connection"); objConnection.open("Provider=SQLNCLI11;Initial Catalog=test;Data Source=.;Integrated Security=SSPI;"); objConnection.CommandTimeout = 1; let objRs = new ActiveXObject("ADODB.Recordset"); let strComm = "set nocount on; declare @p int; while (1=1) begin set @p=1; end;"; //let strComm = "select 1;"; console.log('opening...'); alert('before'); objRs.open(strComm, objConnection); console.log('OK!'); alert('OK!'); </script> ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:20 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
Не, ну зачем читать мануалы? https://docs.microsoft.com/ru-ru/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 Параметр CommandTimeout для объекта соединения не влияет на параметр CommandTimeout в объекте Command в том же соединении. то есть, свойство CommandTimeout объекта команды не наследует значение значения CommandTimeout объекта соединения . ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:27 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
aleks222 Не, ну зачем читать мануалы? https://docs.microsoft.com/ru-ru/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15 Параметр CommandTimeout для объекта соединения не влияет на параметр CommandTimeout в объекте Command в том же соединении. то есть, свойство CommandTimeout объекта команды не наследует значение значения CommandTimeout объекта соединения . а где здесь объект Command? покажите! ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:28 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1 Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:36 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
тебе нужно не это использовать - ADODB.Recordset, а это - ADODB.Command ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:38 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
я создаю Recordset, а не Command! смотрите внимательнее но можно даже и без него: <script> let objConnection = new ActiveXObject("ADODB.Connection"); objConnection.open("Provider=SQLNCLI11;Initial Catalog=test;Data Source=.;Integrated Security=SSPI;"); objConnection.CommandTimeout = 1; //let objRs = new ActiveXObject("ADODB.Recordset"); let strComm = "set nocount on; declare @p int; while (1=1) begin set @p=1; end;"; //let strComm = "UPDATE t SET i1=1 WHERE v1='asdjalsdjlaksjdlkasjdlkajsd lkajdlkasjdlkajsldkjas'"; //let strComm = "select 1"; alert('before'); var affected = 0; objConnection.execute(strComm,affected,1); alert('OK!'); </script> обратите внимание - запрос с циклом зависает, а запрос с UPDATE выбивает Query Timeout ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:41 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
в 2-х местах выставлять , примерно так (VBScript): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:42 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
Konst_One тебе нужно не это использовать - ADODB.Recordset, а это - ADODB.Command да ну? а Recordset че нельзя? варианты с только Connection, с Recordset и Command дают тот же самый результат: "set nocount on; declare @p int; while (1=1) begin set @p=1; end;" - зависает "UPDATE t SET i1=1 WHERE v1='asdjalsdjlaksjdlkasjdlkajsd lkajdlkasjdlkajsldkjas'" - выдает Query Timeout ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 18:43 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1 В чем тут проблема может быть? В SSMS на ваш пример таймаут срабатывает штатно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 19:09 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
invm victorov1 В чем тут проблема может быть? В SSMS на ваш пример таймаут срабатывает штатно. знать бы какая проблема и как ее исправить.. пробовал в качестве клиента IE, c++ ADODB, Delphi, sqlcmd провайдеры: SQLOLEDB.1, SQLNCLI11 SQL-сервер: 2014, 2005 результат одинаков ну вот совсем просто проверить: sqlcmd -q "set nocount on; declare @p int; while (1=1) begin set @p=1; end;" -t 1 у меня висит ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 19:11 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1, смотрите, вы ожидаете несколько иного поведения от CommandTimeout он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение. В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога. если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted и посмотрите на поведение двух разных инструкций Код: sql 1.
Код: sql 1.
и запустите sqlcmd с -t 1 вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен. во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 19:45 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
felix_ff victorov1, смотрите, вы ожидаете несколько иного поведения от CommandTimeout он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение. В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога. если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted и посмотрите на поведение двух разных инструкций Код: sql 1.
Код: sql 1.
и запустите sqlcmd с -t 1 вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен. во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту. пожалуй вы правы - единственное разумное объяснение просто коллеги выше уверяли, что у них все работает и выдает таймаут спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 19:49 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
felix_ff victorov1, смотрите, вы ожидаете несколько иного поведения от CommandTimeout он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение. В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога. если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted и посмотрите на поведение двух разных инструкций Код: sql 1.
Код: sql 1.
и запустите sqlcmd с -t 1 вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен. во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту. Клиенту начхать сколько StmtCompleted в пакете или процедуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 19:51 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1, что еще стоит обратить внимание у каждого провайдера свое реагирование на этот параметр на одинаковом запросе Код: sql 1.
к примеру .Net SqlClient Data Provider отваливается по таймауту (он же SQLNCLI) а подключение через ODBC интерфейс продолжает выполняться. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 20:04 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
aleks222 felix_ff victorov1, смотрите, вы ожидаете несколько иного поведения от CommandTimeout он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение. В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога. если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted и посмотрите на поведение двух разных инструкций Код: sql 1.
Код: sql 1.
и запустите sqlcmd с -t 1 вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен. во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту. Клиенту начхать сколько StmtCompleted в пакете или процедуре. по трафику клиент-сервер видно, что даже с NOCOUNT ON при запуске такого бесконечного цикла сервер непрерывно отправвляет клиенту пакеты ответов, не трудно предпопложить что это отчет о выполнении каждого stmt, соотв. timeout и не срабатывает. Когда же выполняем один долгий stmt, то и пакет ответа приходит только после его выполнения ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 20:10 |
|
не отрабатывает CommandTimeout
|
|||
---|---|---|---|
#18+
victorov1 aleks222 пропущено... Клиенту начхать сколько StmtCompleted в пакете или процедуре. по трафику клиент-сервер видно, что даже с NOCOUNT ON при запуске такого бесконечного цикла сервер непрерывно отправвляет клиенту пакеты ответов, не трудно предпопложить что это отчет о выполнении каждого stmt, соотв. timeout и не срабатывает. Когда же выполняем один долгий stmt, то и пакет ответа приходит только после его выполнения У меня - не отправляет. Все процедуры с "дохрена и более инструкциями, циклами и т.д. и т.п." ничего не отсылают клиенту, пока не выполнят Код: sql 1.
- явный возврат рекордсета. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2021, 20:51 |
|
|
start [/forum/topic.php?fid=46&fpage=21&tid=1684581]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 283ms |
total: | 465ms |
0 / 0 |