powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / не отрабатывает CommandTimeout
25 сообщений из 34, страница 1 из 2
не отрабатывает CommandTimeout
    #40078673
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подскажите,
выполняю такой запрос

begin transaction
WHILE (1=1)
begin
insert into t values(1)
end
commit transaction

и устанавливаю CommandTimeout в 5 сек, к примеру.
В итоге запрос висит до бесконечности (даже превышая дефолтовый 30 сек), а должен через 5 сек выдать ошибку Query Timeout

В чем тут проблема может быть?
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078675
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1,

спросите на форуме по C#. SQL Server к этому не имеет отношения.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078676
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
точно также себя ведет sqlcmd.exe с тем же запросом при указании параметра -t <timeout>
тоже зависает до бесконечности
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078678
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1,

это в любом случае проблема клиентского приложения. Сервер как на этот параметр может повлиять? Держит, не отпускает?
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078680
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1,

где то накосячили в коде;

Код: sql
1.
2.
3.
4.
5.
6.
var cn = new SqlConnection("Data Source=.; Initial Catalog=test; Intergrated Security=SSPI;");
cn.Open();
var cmd = new SqlCommand("begin tran; while (1=1) begin insert into t values (1); end; commit transaction;", cn);
System.Data.StatementCompletedEventHandler handler = (object o, System.Data.StatementCompletedEventArgs e) => { Console.WriteLine(e.RecordCount); };
cmd.CommandTimeout = 5;
cmd.ExecuteNonQuery();



через 5 секунд вышибает по SqlException
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078682
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прикол в том, что не меняя код, а только sql-запрос на UPDATE t SET i=i+1 WHERE ... (специально заполняю таблицу на миллионы записей, чтобы выполнялся долго) - и в таком случае таймаут отрабатывает, а код тот же. странно
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078689
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1
прикол в том, что не меняя код, а только sql-запрос на UPDATE t SET i=i+1 WHERE ... (специально заполняю таблицу на миллионы записей, чтобы выполнялся долго) - и в таком случае таймаут отрабатывает, а код тот же. странно


Прикол в том, что надо бы учиться думать.

1. Как клиент определяет "жив сервер и запрос или мертв?"
2. Просто и незатейливо: "сервер НИЧЕГО не передает на клиента".
3. Откуда следует незатейливый вывод:

Код: sql
1.
2.
3.
4.
5.
6.
7.
SET NOCOUNT ON;
begin transaction
WHILE (1=1)
begin
insert into t values(1)
end
commit transaction



и будет тебе таймаут.

Или
Код: sql
1.
2.
print 'Хрен тебе, а не таймаут!'
UPDATE t SET i=i+1 WHERE ... -- (специально заполняю таблицу на миллионы записей, чтобы выполнялся долго) - и в таком случае таймаут отрабатывает, а код тот же. странно


и НЕ будет тебе таймаута.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078690
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, думал над этим и пробовал с NOCOUNT ON - результат увы, тот же самый
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078695
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот для запуска через 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>
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078699
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну зачем читать мануалы?
https://docs.microsoft.com/ru-ru/sql/ado/reference/ado-api/commandtimeout-property-ado?view=sql-server-ver15

Параметр CommandTimeout для объекта соединения не влияет на параметр CommandTimeout в объекте Command в том же соединении. то есть, свойство CommandTimeout объекта команды не наследует значение значения CommandTimeout объекта соединения .
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078700
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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? покажите!
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078702
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1


Код: sql
1.
2.
objRs.open(strComm,   
           objConnection);  



...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078704
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тебе нужно не это использовать - ADODB.Recordset, а это - ADODB.Command
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078705
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я создаю 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
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078707
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 2-х местах выставлять , примерно так (VBScript):

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
set con = createObject("ADODB.Connection")
con.open connectionString
con.commandTimeout = 60
set command = createObject("ADODB.Command")
command.activeConnection = con
command.commandType = adCmdText
command.commandText = sql
command.commandTimeout = 60
command.execute
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078708
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078716
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1
В чем тут проблема может быть?
В клиенте.
В SSMS на ваш пример таймаут срабатывает штатно.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078718
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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

у меня висит
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078731
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1,

смотрите, вы ожидаете несколько иного поведения от CommandTimeout

он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение.

В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога.


если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted

и посмотрите на поведение двух разных инструкций
Код: sql
1.
declare @p int; while (1=1) begin set @p=1; end;


Код: sql
1.
declare @p int; waitfor delay '00:00:05'; set @p = 1;



и запустите sqlcmd с -t 1

вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен.
во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078732
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
victorov1,

смотрите, вы ожидаете несколько иного поведения от CommandTimeout

он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение.

В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога.


если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted

и посмотрите на поведение двух разных инструкций
Код: sql
1.
declare @p int; while (1=1) begin set @p=1; end;


Код: sql
1.
declare @p int; waitfor delay '00:00:05'; set @p = 1;



и запустите sqlcmd с -t 1

вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен.
во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту.


пожалуй вы правы - единственное разумное объяснение
просто коллеги выше уверяли, что у них все работает и выдает таймаут
спасибо
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078733
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
victorov1,

смотрите, вы ожидаете несколько иного поведения от CommandTimeout

он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение.

В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога.


если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted

и посмотрите на поведение двух разных инструкций
Код: sql
1.
declare @p int; while (1=1) begin set @p=1; end;


Код: sql
1.
declare @p int; waitfor delay '00:00:05'; set @p = 1;



и запустите sqlcmd с -t 1

вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен.
во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту.


Клиенту начхать сколько StmtCompleted в пакете или процедуре.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078738
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1,

что еще стоит обратить внимание у каждого провайдера свое реагирование на этот параметр

на одинаковом запросе
Код: sql
1.
begin tran; while (1=1) begin insert into [dbo].[t] values (1); end; commit tran;



к примеру .Net SqlClient Data Provider отваливается по таймауту (он же SQLNCLI)
а подключение через ODBC интерфейс продолжает выполняться.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078739
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
felix_ff
victorov1,

смотрите, вы ожидаете несколько иного поведения от CommandTimeout

он срабатывает если интервал выполнения отдельного стейтмента превышает пороговое значение.

В вашем же примере вы запускаете бесконечный цикл в котором срабатывает отдельный стейтмент и он очень быстро выполняется до заданного порога.


если хотите убедиться запустите профайлер на события Sql:BatchCompelted и Sql:StmtCompleted

и посмотрите на поведение двух разных инструкций
Код: sql
1.
declare @p int; while (1=1) begin set @p=1; end;


Код: sql
1.
declare @p int; waitfor delay '00:00:05'; set @p = 1;



и запустите sqlcmd с -t 1

вы увидите что в первом вариант Sql:StmtCompleted срабатывает кучу раз, тем самым интервал ожидания не нарушен.
во втором варианте отдельный стейтмент превышает порог и вылетает по таймауту.


Клиенту начхать сколько StmtCompleted в пакете или процедуре.


по трафику клиент-сервер видно, что даже с NOCOUNT ON при запуске такого бесконечного цикла сервер непрерывно отправвляет клиенту пакеты ответов, не трудно предпопложить что это отчет о выполнении каждого stmt, соотв. timeout и не срабатывает. Когда же выполняем один долгий stmt, то и пакет ответа приходит только после его выполнения
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078750
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
victorov1
aleks222
пропущено...


Клиенту начхать сколько StmtCompleted в пакете или процедуре.


по трафику клиент-сервер видно, что даже с NOCOUNT ON при запуске такого бесконечного цикла сервер непрерывно отправвляет клиенту пакеты ответов, не трудно предпопложить что это отчет о выполнении каждого stmt, соотв. timeout и не срабатывает. Когда же выполняем один долгий stmt, то и пакет ответа приходит только после его выполнения


У меня - не отправляет.
Все процедуры с "дохрена и более инструкциями, циклами и т.д. и т.п." ничего не отсылают клиенту, пока не выполнят
Код: sql
1.
select ... from ...


- явный возврат рекордсета.
...
Рейтинг: 0 / 0
не отрабатывает CommandTimeout
    #40078753
victorov1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
плохо что MS в документации эти ньюансы с таймаутами никак не прояснила...
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / не отрабатывает CommandTimeout
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]