Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
9 / 9 / 13
Регистрация: 25.10.2014
Сообщений: 52

Как заблокировать повторный запуск процедуры?

12.12.2014, 11:33. Показов 3062. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две хранимых процедуры, - lock и unlock.
Процедура unlock - изменяет (update) значения столбца state в таблице account с 1 на 0.
Процедура lock - изменяет значения state с 0 на 1.

Процедуры применяются в следующем порядке:
Выполняется unlock
Пользователь делает необходимую работу связанную с таблицей account.
Выполняется lock

Вопрос. Как выполнить в процедуре unlock проверку повторного запуска?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2014, 11:33
Ответы с готовыми решениями:

Повторный запуск процедуры при неверном вводе значения
Всем привет! Не могу запустить программу заново. Многие способы использовал, но программа все равно не хочет работать. Прошу подкинуть...

Как избежать повторный запуск приложения?
Подскажите как можно избежать повторного запуска программы? Поясню: я написал программу, в которой при нажатии кнопки открывается Nero....

Как запретить повторный запуск программы
При загрузке формы запретить запуск этой формы еще раз , допустим что бы выводило "Это программа уже запущена!".

13
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
12.12.2014, 13:24
Что имеется в виду под повторным запуском? Повторное выполнение в той же сессии или параллельное из разных сессий?
В общем, задачу опишите подробнее.
0
9 / 9 / 13
Регистрация: 25.10.2014
Сообщений: 52
12.12.2014, 15:31  [ТС]
Попробую описать подробнее.

Правильная последовательность действий
Кликните здесь для просмотра всего текста

SQL
1
2
3
USE namedb
GO 
EXEC UNLOCK;
Ждем неопределенное время, пока пользователь сделает то, что ему надо с таблицей account, и сообщит нам об этом.
Тогда выполняем
SQL
1
2
3
USE namedb
GO 
EXEC LOCK; --возвращаем в таблице account единички

Не правильная последовательность действий
Кликните здесь для просмотра всего текста
SQL
1
2
3
4
USE namedb
GO 
EXEC UNLOCK;
EXEC UNLOCK; -- ошибка. Процедура запущенна второй раз.

Допустить повторный запуск процедуры unlock крайне не желательно. Только если после процедуры lock.

Вариант решения который я себе представляю, - это создание таблицы в которую будет записываться id процедуры (object_id('unlock', 'P')) ее имя и статус. В теле процедуры будет выполняться поиск в этой таблице по имени, и если статус процедуры будет "уже была запущенна", то будет выполнен выход из процедуры. Сброс статуса для процедуры unlock будет выполнятся в процедуре lock.

В этом варианте решения мне кажется не правильно использовать дополнительную таблицу для хранения статуса процедуры. Но опыта для создания другого решения нет. Подскажите пожалуйста.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
12.12.2014, 17:27
Цитата Сообщение от Aleks_Tret Посмотреть сообщение
Допустить повторный запуск процедуры unlock крайне не желательно.
Почему, если state фактически не меняется?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
12.12.2014, 19:30
Aleks_Tret, может быть вам не хватало команды RETURN?
0
9 / 9 / 13
Регистрация: 25.10.2014
Сообщений: 52
13.12.2014, 00:51  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
Почему, если state фактически не меняется?
Да, не меняется, так как первый запуск unlock уже изменил state, но unlock делает не только это. Что бы "запомнить" в каких записях был изменен state в процедуре выполняется insert в таблицу block. Это нужно, что бы процедура lock поставила state = 1 только нужным записям. Хочется избежать повторного insert когда все state уже равны 0. И хочется избежать drop\create table block перед insert, так как можно "забыть" каким полям поставили state = 0. Я не стал умышленно это расписывать, так как сути вопроса это принципиально не меняет. Ну мне так кажется...

Цитата Сообщение от cygapb-007 Посмотреть сообщение
Aleks_Tret, может быть вам не хватало команды RETURN?
Зачем же вы так то.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
13.12.2014, 10:51
Цитата Сообщение от Aleks_Tret Посмотреть сообщение
но unlock делает не только это
Сделайте процедуру по такому шаблону:
T-SQL
1
2
3
4
5
6
7
8
create procedure unlock ...
as
begin
 update account set state = 0 where ... and state = 1;
 if @@rowcount = 0
  return;
 ...
end;
ЗЫ: Складывается впечатление, что вы решаете обыденную задачу весьма странным способом. Может озвучите ее (задачу)?
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
13.12.2014, 13:36
Что-то подобное я и имел в виду. Если включить семафор не удалось (т.к. уже включен), вернуть неудачу через RETURN, иначе доделать обвязку и вернуть RETURN 1 (например)

А при вызове процедуры получить код возврата и проанализировать его. Все примеры есть по ссылке.

Добавлено через 7 минут
Кстати, вот еще может помочь: THROW
0
9 / 9 / 13
Регистрация: 25.10.2014
Сообщений: 52
13.12.2014, 22:03  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
Складывается впечатление, что вы решаете обыденную задачу весьма странным способом. Может озвучите ее (задачу)?
Да. Мне надо разблокировать записи (поменять значение поля state на 0). После того, как пользователь выполнит свои задачи, эти записи (не все) надо заблокировать обратно.

Сделать это я решил при помощи двух процедур.
Процедура unlock разблокирует и записывает id записей в доп таблицу . Процедура lock блокирует, ориентируясь на эту доп таблицу.

Возник вопрос. Как вообще можно проверить повторный запуск процедуры?
Своя мысль - только через вспомогательную таблицу. Поэтому решил спросить, есть ли еще варианты?

Цитата Сообщение от cygapb-007 Посмотреть сообщение
Кстати, вот еще может помочь: THROW
Нет, сервер 2005.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
14.12.2014, 10:43
Ну так RAISERROR, суть не меняется
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
15.12.2014, 12:02
Aleks_Tret, Можно биться головой об стену, пытаясь предотвратить повторный запуск процедуры. А можно просто не обрабатывать данные повторно. Уже было показано как это сделать.
0
9 / 9 / 13
Регистрация: 25.10.2014
Сообщений: 52
16.12.2014, 08:19  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
Можно биться головой об стену, пытаясь предотвратить повторный запуск процедуры. А можно просто не обрабатывать данные повторно. Уже было показано как это сделать.
Для того и форум, что бы спросить ответ. Если бы я хотел избежать проверки повторного запуска, тогда вы конечно правы. Но я хочу поискать другой путь, как мне кажется, тоже применимый.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
16.12.2014, 11:15
Цитата Сообщение от Aleks_Tret Посмотреть сообщение
Но я хочу поискать другой путь, как мне кажется, тоже применимый.
Да ради Бога, никто не будет вас уговаривать. Граблетерапия - тоже способ получения опыта.
0
9 / 9 / 13
Регистрация: 25.10.2014
Сообщений: 52
16.12.2014, 20:56  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
Да ради Бога, никто не будет вас уговаривать. Граблетерапия - тоже способ получения опыта.
Вопрос был не про то что вы советуете,а ваш капитанский ответ его не решает, но это вас ведь не волнует.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2014, 20:56
Помогаю со студенческими работами здесь

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

Повторный вызов процедуры
Вопрос такой. Есть процедура например procedure Ti1.N21Click(Sender: TObject); вот , при ее нажатии выскакивает форма которая например...

Повторный вызов процедуры
Всем очень добрый день! А подскажите,пожалуйста,в Си++ процедура может вызываться несколько раз в различных местах кода,как в Паскале?

Повторный запуск
На работе создал скрипт-программу backup.ps1 которая бекапит базу пользователей каждые 30 минут, выполняет некоторые обработки и сохраняет...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru