|
|
|
Блокировка таблиц в хранимой процедуре?
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Судя по доке , в хранимых процедурах нельзя использовать блокировку таблиц. Есть хранимка, в которой пересчитываются некоторые итоговые цифры и новые их значения записываются в итоговую InnoDB-таблицу. Запускается эта процедура редко, но может быть запущена из прикладной проги пользователем с правами админа. Естественно, в такие моменты база не закрыта и другие пользователи могут выполнять операции, которые могут использовать/изменять данные из вышеназванной итоговой таблицы. Хотелось бы на время выполнения этой хранимки запретить другим пользователям изменять вышеназванную итоговую табличку. Транзакции не хочу использовать, т.к. для InnoDB они не дадут нужного эффекта - будут блокированы только те записи из итоговой таблицы, которые уже обработаны процедурой пересчета. А другие записи остануться доступны для изменения другим пользователям. Если я правильно понял, то единственный выход - на клиенте запускать эту хранимку в одном SQL-запросе вместе с блокировкой: Код: sql 1. Честно говоря, не нравится мне этот код - хотел бы все действия, необходимые для правильной и корректной обработки, "запаковать" в один "контейнер"! Может кто чего посоветовать по этому поводу? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 03:39 |
|
||
|
Блокировка таблиц в хранимой процедуре?
|
|||
|---|---|---|---|
|
#18+
OlegROA, select for update? Правда, я не уверен, будет ли он работать в процедурах. Вроде бы должен, только процедуру надо запускать в транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 05:15 |
|
||
|
Блокировка таблиц в хранимой процедуре?
|
|||
|---|---|---|---|
|
#18+
Насколько я понял из описания, меня "напрягают" две особенности этой конструкции: - при "отваливании" сессии блокировка остается - для блокировки всей таблицы нужно дать селект на все записи этой таблицы Блин, сейчас еще раз перечитал про блокировку таблиц - нужно блокировать ВСЕ таблицы, которые так или иначе участвуют в процессе! Даже если во время блокировки я всего лишь читаю другие таблицы, их тоже нужно блокировать! Жесть! Что-бы придумать для полной блокировки только одной таблицы!? Ну, или хотя бы для блокировки на запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 07:10 |
|
||
|
Блокировка таблиц в хранимой процедуре?
|
|||
|---|---|---|---|
|
#18+
Хотя я что-то вообще не понял, в чём у вас затык. Если вам надо один раз прочитать все таблицы, выполнить какой-то расчёт и один раз в них записать данные, вас repeatable read должен вполне устроить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.01.2014, 07:40 |
|
||
|
Блокировка таблиц в хранимой процедуре?
|
|||
|---|---|---|---|
|
#18+
сделайте реплику для статистики. останавливайте ее перед выполнением хранимки, считайте что надо и запускайте вновь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.06.2016, 14:26 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39262276&tid=1831632]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
157ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 466ms |

| 0 / 0 |
