Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / кто контролирует CommandTimeout - сервер, provider, или оба? / 16 сообщений из 16, страница 1 из 1
15.06.2021, 16:10
    #40077687
victorov1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
Собственно вопрос в сабже. MS официально это не описывает, описание CommandTimeout очень скудное.
Если контролируют и provider, и сервер, то очень вероятен вариант рассинхронизации - когда сервер транзакцию выполнил и вернул ответ, а клиент не успел все стянуть из-за слабой сети и вернул ошибку. Т.е. транзакция завершена успешно на сервере, а я на клиенте думаю что нет!
Если только сервер, то тогда из-за проблем с TCP соеднинением клиент в теории может ждать ответа бесконечно долго.
Если только provider, то понятно что невозможно из-за риска прихода след. команды пока висит в обработке пред.
В общем, где можно подробно прочитать?
Спасибо.
...
Рейтинг: 0 / 0
15.06.2021, 16:13
    #40077689
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
victorov1,

сервер таймауты при выполнении не устаивает, иначе возникнет ошибка, о которой Вы писали.
...
Рейтинг: 0 / 0
15.06.2021, 16:26
    #40077695
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
Владислав Колосов,

С чего бы сервер не устанавливает? Смотря где )
...
Рейтинг: 0 / 0
15.06.2021, 16:31
    #40077696
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
Клиент перед выполнением команды говорит серверу - если команда выполняется более CommandTimeout - значит что-то пошло не так, пристрели ее, верни ошибку, будем разбиратся.
Входит ли в этот таймаут время фетча - не знаю.
Также было бы интересно есть ли способ поменять дефолтные 30 секунд на что нибудь другое не перекомпилируя приложение. (типа в реестре у клиента подкрутить, чтобы поменять дефолт на 1 минуту)
...
Рейтинг: 0 / 0
15.06.2021, 16:33
    #40077697
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
Критик,

это же коннекты, а не рантайм. По крайне мере, запросы через 10 минут не отваливаются. Скорее всего. эта настройка для связанных серверов.
...
Рейтинг: 0 / 0
15.06.2021, 17:22
    #40077712
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
Критик,

не стоит путать remote query timeout настроек конфигурации сервера который задается через sp_configure с настройками клиента SqlClient.

remote query timeout задает время ожидания для исходящих запросов от конкретного экземпляра сервера. в данном случае применительно к установке ожидания для запросов через линкованные сервера.

victorov1,
настройка же commandTimeout это настройка клиента задаваемая свойством для объекта экземпляра SqlCommand.
явно ее можно выставить через строку соединения/или непосредственно само свойство объекта, но дефолтного значения через правку реестра и прочих танцов с бубнами нет
...
Рейтинг: 0 / 0
15.06.2021, 17:26
    #40077714
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
...
Рейтинг: 0 / 0
15.06.2021, 17:45
    #40077724
victorov1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
felix_ff
Критик,

не стоит путать remote query timeout настроек конфигурации сервера который задается через sp_configure с настройками клиента SqlClient.

remote query timeout задает время ожидания для исходящих запросов от конкретного экземпляра сервера. в данном случае применительно к установке ожидания для запросов через линкованные сервера.

victorov1,
настройка же commandTimeout это настройка клиента задаваемая свойством для объекта экземпляра SqlCommand.
явно ее можно выставить через строку соединения/или непосредственно само свойство объекта, но дефолтного значения через правку реестра и прочих танцов с бубнами нет


В реестре я ничего и не собирался менять. Мне важно понять логику.
Если сервер бесконечно отрабатывает транзакцию (или до обрыва соединения с клиентом) и не принимает ConnectionTimeout от провайдера, то как будет все работать если клиент отвалится в ходе выполнения длительной транзакции и TCP_FIN не был отправлен из-за обрыва кабеля или чего-то еще? Т.е. сервер будет думать, что клиент еще висит и ждет (TCP-соединение формально не оборвано), а он (клиент) давно отвалился, получил Query Timeout от ADO и возможно переподключился снова и снова попытался выполнить тот же долгий SQL-запрос, т.к. предыдущий был завершен с таймаутом. В итоге можем получить ситуацию, при которой сервер нагнется из-за бесконечного числа параллельных тяжелых запросов.
Я пытался снифферить трафик между провайдером и сервером - так вот никакие poll периодические там не отправляются. Т.е. в теории описанный мною сценарий теоретически возможен. Но это ж пипец, товарищи!
Наверняка же все это учтено и все не так плохо? Как предотвратить?
Т.е. если я получил Query Timeout, как узнать что сервер действительно отменил эту транзакцию в данный момент? Или, если это невозможно, то тогда нужно обрывать соединение принудительно, но как я описал выше - способ тоже ненадежный.
Более надежнее было серверу также ориентироваться на CommandTimeout.
Похоже придется тупо экспериментировать...
...
Рейтинг: 0 / 0
15.06.2021, 18:18
    #40077739
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
...
Рейтинг: 0 / 0
15.06.2021, 18:39
    #40077746
victorov1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
спасибо, буду разбираться
...
Рейтинг: 0 / 0
15.06.2021, 18:52
    #40077751
victorov1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?


Так это настройки на клиенте, а не сервере. Это клиент посылает keepalives серверу, а не наоборот.
А как сервер будет знать, что клиент отвалился если тот не прислал TCP FIN по какой-то причине? Получается будет висеть и выполнять транзакцию пока не выполнит.

Но главный то вопрос в следующем: если ADO вернуло ошибку таймаута, получается на 100% мы не можем быть уверены, что транзакция не выполнена. Она может быть выполнена успешно за долю секунды до этого, но клиент просто не успел считать данные.

И еще кейс: транзакция долго выполняется, ADO вернуло ошибку таймаута, отменится ли данная транзакция на сервере? Как-то в документации об этом четко не написано: f the interval set in the CommandTimeout property elapses before the command completes execution, an error occurs and ADO cancels the command.
Что такое "cancels the command" непонятно. Означает ли это отмену транзакции или нет?
...
Рейтинг: 0 / 0
15.06.2021, 18:58
    #40077755
victorov1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
victorov1


Так это настройки на клиенте, а не сервере. Это клиент посылает keepalives серверу, а не наоборот.
А как сервер будет знать, что клиент отвалился если тот не прислал TCP FIN по какой-то причине? Получается будет висеть и выполнять транзакцию пока не выполнит.

Но главный то вопрос в следующем: если ADO вернуло ошибку таймаута, получается на 100% мы не можем быть уверены, что транзакция не выполнена. Она может быть выполнена успешно за долю секунды до этого, но клиент просто не успел считать данные.

И еще кейс: транзакция долго выполняется, ADO вернуло ошибку таймаута, отменится ли данная транзакция на сервере? Как-то в документации об этом четко не написано: if the interval set in the CommandTimeout property elapses before the command completes execution, an error occurs and ADO cancels the command.
Что такое "cancels the command" непонятно. Означает ли это отмену транзакции или нет?
...
Рейтинг: 0 / 0
15.06.2021, 19:31
    #40077761
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
victorov1
Так это настройки на клиенте, а не сервере.
Читайте внимательно. Это серверные настройки.
victorov1
Это клиент посылает keepalives серверу, а не наоборот.
https://en.wikipedia.org/wiki/Keepalive#TCP_keepaliveMost hosts that support TCP also support TCP Keepalive. Each host (or peer) periodically sends a TCP packet to its peer which solicits a response. If a certain number of keepalives are sent and no response (ACK) is received then the sending host will terminate the connection from its end.
...
Рейтинг: 0 / 0
15.06.2021, 19:35
    #40077762
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
felix_ff,

Я в курсе, даже наступил на это разок со связанными серверами. Просто выше написано, что "сервер не устанавливает таймауты". Иногда устанавливает.
...
Рейтинг: 0 / 0
15.06.2021, 21:05
    #40077780
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
Критик,

речь шла о конкретном сценарии, а не "вообще во вселенной". Не надо подменять факты.
...
Рейтинг: 0 / 0
15.06.2021, 21:06
    #40077781
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто контролирует CommandTimeout - сервер, provider, или оба?
victorov1,

Т.е. транзакция завершена успешно на сервере, а я на клиенте думаю что нет!

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


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