Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Блокировка таблиц в хранимой процедуре? / 6 сообщений из 6, страница 1 из 1
10.01.2014, 03:39
    #38521197
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка таблиц в хранимой процедуре?
Добрый день, коллеги!

Судя по доке , в хранимых процедурах нельзя использовать блокировку таблиц.

Есть хранимка, в которой пересчитываются некоторые итоговые цифры и новые их значения записываются в итоговую InnoDB-таблицу.
Запускается эта процедура редко, но может быть запущена из прикладной проги пользователем с правами админа.
Естественно, в такие моменты база не закрыта и другие пользователи могут выполнять операции, которые могут использовать/изменять данные из вышеназванной итоговой таблицы.
Хотелось бы на время выполнения этой хранимки запретить другим пользователям изменять вышеназванную итоговую табличку.

Транзакции не хочу использовать, т.к. для InnoDB они не дадут нужного эффекта - будут блокированы только те записи из итоговой таблицы, которые уже обработаны процедурой пересчета. А другие записи остануться доступны для изменения другим пользователям.

Если я правильно понял, то единственный выход - на клиенте запускать эту хранимку в одном SQL-запросе вместе с блокировкой:
Код: sql
1.
LOCK TABLES Table1 WRITE; CALL reCalcProc(); UNLOCK TABLES

Честно говоря, не нравится мне этот код - хотел бы все действия, необходимые для правильной и корректной обработки, "запаковать" в один "контейнер"!

Может кто чего посоветовать по этому поводу?

Спасибо!
...
Рейтинг: 0 / 0
10.01.2014, 05:15
    #38521224
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка таблиц в хранимой процедуре?
OlegROA,

select for update? Правда, я не уверен, будет ли он работать в процедурах. Вроде бы должен, только процедуру надо запускать в транзакции.
...
Рейтинг: 0 / 0
10.01.2014, 07:10
    #38521245
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка таблиц в хранимой процедуре?
Насколько я понял из описания, меня "напрягают" две особенности этой конструкции:
- при "отваливании" сессии блокировка остается
- для блокировки всей таблицы нужно дать селект на все записи этой таблицы

Блин, сейчас еще раз перечитал про блокировку таблиц - нужно блокировать ВСЕ таблицы, которые так или иначе участвуют в процессе! Даже если во время блокировки я всего лишь читаю другие таблицы, их тоже нужно блокировать! Жесть!

Что-бы придумать для полной блокировки только одной таблицы!? Ну, или хотя бы для блокировки на запись?
...
Рейтинг: 0 / 0
10.01.2014, 07:40
    #38521252
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка таблиц в хранимой процедуре?
Хотя я что-то вообще не понял, в чём у вас затык.
Если вам надо один раз прочитать все таблицы, выполнить какой-то расчёт и один раз в них записать данные, вас repeatable read должен вполне устроить.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
24.06.2016, 14:26
    #39261822
Блокировка таблиц в хранимой процедуре?
сделайте реплику для статистики. останавливайте ее перед выполнением хранимки, считайте что надо и запускайте вновь.
...
Рейтинг: 0 / 0
25.06.2016, 14:49
    #39262276
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Блокировка таблиц в хранимой процедуре?
tanglirOlegROA,

select for update? Правда, я не уверен, будет ли он работать в процедурах. Вроде бы должен, только процедуру надо запускать в транзакции.


будет.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Блокировка таблиц в хранимой процедуре? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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