Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
Есть довольно объемная хранимка на сервере, выполнение которой клиент может не дождаться из-за таймаута.
Возможно ли отловить данное событие в процедуре?

Microsoft SQL Server 2016 (SP1-CU3) (KB4019916) - 13.0.4435.0 (X64) Apr 27 2017 17:36:12 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2016 Standard 6.3 <X64> (Build 14393: ) (Hypervisor)
25 янв 19, 12:16    [21794124]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36691
Нет, конечно. Почта России тоже не в курсе, что адресат в некоторых случаях умирает от старости до того, как они доставят ему что-либо.
25 янв 19, 12:27    [21794137]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KRS544,

ихо таймаут отправляет rollback на сервер
25 янв 19, 12:34    [21794147]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
т.е. в начале процедуры выставлять какой либо флаг в таблице и смотреть откатятся изменения или нет.
25 янв 19, 12:41    [21794158]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7396
KRS544,

непонятен смысл постановки задачи. Ничего не надо отлавливать на самом деле.
25 янв 19, 12:45    [21794168]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
TaPaK
ихо таймаут отправляет rollback на сервер
Нет.
Будет ли откат зависит от значения xact_abort.
25 янв 19, 12:49    [21794180]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
Смысл в том, что бы оперативно реагировать на проблемы, возникающие в процессе работы клиентов.
Проще собирать данные с сервера, а не собирать логи с клиентов.
25 янв 19, 12:50    [21794181]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7396
invm,

по моему разумению при таймауте выполнения клиент должен отключить сеанс.
25 янв 19, 12:52    [21794185]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
aleks222
Member

Откуда:
Сообщений: 850
KRS544
Есть довольно объемная хранимка на сервере, выполнение которой клиент может не дождаться из-за таймаута.
Возможно ли отловить данное событие в процедуре?

Microsoft SQL Server 2016 (SP1-CU3) (KB4019916) - 13.0.4435.0 (X64) Apr 27 2017 17:36:12 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows Server 2016 Standard 6.3 <X64> (Build 14393: ) (Hypervisor)


1. Процедура выполняется ВНЕ транзакции - можно. Запись в табличку в начале и стирание записи в конце процедуры. Проверка оставшихся записей.

2. Процедура выполняется В транзакции и вы готовы слегка поступиться быстродействием. CRL или xp_cmdshell - запись в табличку в начале и стирание записи в конце процедуры.

2. Процедура выполняется В транзакции - запись в табличку в КОНЦЕ. Но нипонятно, как отследить факт запуска? Рази только вести протокол о намерениях: т.е. запускать вне транзакции ДОП. процедуру, которая зарегистрирует намерение запустить нужную, а нужная - сотрет или пометит как исполненное.
25 янв 19, 12:53    [21794187]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33249
Блог
aleks222,

Откройте для себя поведение табличных переменных в транзациях, прежде чем рекомендовать xp_cmdshell
25 янв 19, 12:59    [21794191]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7396
KRS544,

нет, сервер баз данных над использовать по назначению, а информацию о дисконнектах собирать либо на слое приложений, если такой есть, либо на самих клиентах, например, через журнал приложения в Windows.

Журналы могут быть переданы на некий агрегатор и эта технология существует в Windows.
25 янв 19, 13:04    [21794198]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
Владислав Колосов, это демагогия, случаи разные бывают
25 янв 19, 13:09    [21794204]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
TaPaK
ихо таймаут отправляет rollback на сервер
Нет.
Будет ли откат зависит от значения xact_abort.

да, правильно, Грубо говоря отправляется "Stop" как в ssms. Возникает событие Attention и при обработке уже всё зависит от
параметров xact_abort.
Можно ловить через EE Attention https://www.red-gate.com/simple-talk/blogs/identifying-client-timeouts/
25 янв 19, 13:09    [21794205]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
Критик, можно подробнее, как использовать табличные переменные в моем случае?
25 янв 19, 13:10    [21794208]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
KRS544
как использовать табличные переменные в моем случае?
В вашем случае ничто не поможет.
Ибо при клиентском тайм-ауте (или отмене) прекращается выполнение текущего пакета. Т.е. узнать в самой процедуре, что ее вполнение было прервано невозможно.
25 янв 19, 13:30    [21794236]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
aleks222
Member

Откуда:
Сообщений: 850
Критик
aleks222,

Откройте для себя поведение табличных переменных в транзациях, прежде чем рекомендовать xp_cmdshell


Да я в курсе поведения.
Тока я не в курсе как оно поможет?
25 янв 19, 13:35    [21794242]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
invm
KRS544
как использовать табличные переменные в моем случае?
В вашем случае ничто не поможет.
Ибо при клиентском тайм-ауте (или отмене) прекращается выполнение текущего пакета. Т.е. узнать в самой процедуре, что ее вполнение было прервано невозможно.

Да, я это понял. Решения TaPaK и aleks222 вполне устраивают, спасибо.
Просто не могу понять как можно использовать @table
25 янв 19, 13:44    [21794258]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33249
Блог
KRS544,

в вашем, наверное, никак )
просто я прочитал рекомендацию вне контекста
25 янв 19, 13:50    [21794267]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
KRS544
Просто не могу понять как можно использовать @table
Для ваших целей никак.

Лучше расскажите зачем потребовалось отлавливать клиентский тайм-аут в процедуре.
25 янв 19, 13:54    [21794273]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
invm, если интересно... каждое выполнение процедуры логируется (что то типа билинга), если не отлавливать таймауты, то данные на клиенте и сервере не сойдутся.
25 янв 19, 14:05    [21794286]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
KRS544
invm, если интересно... каждое выполнение процедуры логируется (что то типа билинга), если не отлавливать таймауты, то данные на клиенте и сервере не сойдутся.

делать всё это с клиента не вызывает никаких затруднений
25 янв 19, 14:10    [21794292]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
хотя как получается
автор
данные на клиенте и сервере не сойдутся.

не ясно. Откатывайте на сервере и на клиенте(?)
25 янв 19, 14:13    [21794296]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
KRS544
каждое выполнение процедуры логируется
Вызов процедуры или именно успешное выполнение?
25 янв 19, 14:19    [21794302]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
KRS544
Member

Откуда:
Сообщений: 497
invm, получается вызов. За клиент я не отвечаю, поэтому сложно говорить, что там происходит.
25 янв 19, 15:03    [21794350]     Ответить | Цитировать Сообщить модератору
 Re: Как отловить таймаут клиента в процедуре на сервере  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
KRS544,

Если вызов, то проще всего выполнением логирующей процедуры через self linked server с remote proc transaction promotion = false
25 янв 19, 15:19    [21794370]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить