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

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

У хранимой процедуры, время выполнения колеблется от 30 до 90 секунд, особенности действий процедуры в том, что одновременно может выполняться только одна ее копия

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

или может у меня в принципе логика страдает? и надо по другому делать

повесить постоянный обработчик новых строк в таблице, типа демона? (есть такие?)
8 июн 16, 14:17    [19271394]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
HarDar,
ну если не уточнять, что же творит процедура 30-90 сек для одной записи,

особенности действий процедуры в том, что одновременно может выполняться только одна ее копия
чё?

может вам всё таки надо просто запускать процесс пересчёта, ну допустим раз в день/час...
8 июн 16, 14:19    [19271405]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
HarDar
Member

Откуда:
Сообщений: 19
да уточнить не проблема... думал может так будет ответ ;)

данные в таблицу приходят с набором параметров для расчета

по этим параметрам создается копия рабочего набора данных в пустую таблицу и пересчитывается внешним приложением (вот тут как раз разница во времени)
внешнее приложение может одномоментно считать только один набор данных (одну строку).
потом результат расчета переноситься в другую таблицу и пустая таблица снова готова получать данные.


Вх.Данные
--> табл. А
-- триггер ( табл.Б (данные) --> Пустую таблицу --->изменение по данным табл.А ---> пересчет ---> данные обратно в табл.Б )
-- строка в табл.А обработана

к сожалению раз в день это не возможно, оперативность и все такое :(
8 июн 16, 14:34    [19271491]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
HarDar
по этим параметрам создается копия рабочего набора данных в пустую таблицу и пересчитывается внешним приложением (вот тут как раз разница во времени)
Жуть.

Вас спасет Service Broker. Очередь с внутренней активацией и maxreaders = 1.
В процедуре активации очереди вызывать процедуру расчета.
8 июн 16, 14:42    [19271538]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
o-o
Guest
HarDar
особенности действий процедуры в том, что одновременно может выполняться только одна ее копия
можно ли как то заблокировать выполнение процедуры, пока одна выполняется? и выполнить ее когда первая закончит?

sp_getapplock/sp_releaseapplock
в процедуре получаете Exclusive lock в начале и отпускаете в конце.
вторая запущенная копия его не получит, пока первая не отработает
8 июн 16, 14:42    [19271539]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
HarDar,
варианты
1) джоб. раз в минуту проверяющий есть ли новые записи и запускающий процедуру
2) процедура перед запуском ставит (и проверяет) некий флаг в некой таблице "процедура_xx_запущена" - по окончанию снимает
(или sp_getapplock)
8 июн 16, 14:43    [19271548]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
HarDar
Member

Откуда:
Сообщений: 19
o-o
sp_getapplock/sp_releaseapplock
в процедуре получаете Exclusive lock в начале и отпускаете в конце.
вторая запущенная копия его не получит, пока первая не отработает



а вторая процедура будет ждать освобождения? или не выполниться?
8 июн 16, 15:06    [19271692]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
HarDar
Member

Откуда:
Сообщений: 19
почитал про Service Broker
с первого раза ничего не понял, но буду осваивать
8 июн 16, 15:09    [19271703]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
HarDar
а вторая процедура будет ждать освобождения? или не выполниться?
Либо будет ждать, либо sp_getapplock завершится с ошибкой. Зависит от значения, установленного в set lock_timeout.

Дело в другом - пока в триггере выполняется эта долгоиграющая процедура, транзакция не завершается, что может негативно влиять на другие параллельные транзакции.
8 июн 16, 15:17    [19271747]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
HarDar
Member

Откуда:
Сообщений: 19
Ясно
Спасибо
Буду пробовать.
8 июн 16, 15:29    [19271812]     Ответить | Цитировать Сообщить модератору
 Re: Отложенный запуск второй копии хранимой процедуры  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Что-то мне подсказывает, пока триггер на INSERT не отработает, следующий INSERT не произойдёт.
Или я не прав?
8 июн 16, 19:50    [19273124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить