Mysql запрет за считывание до выполнения определенных действий

12 3
V
На сайте с 10.01.2012
Offline
85
691

Суть собственно такова... Есть голика, которая работает по такому принципу:

Считываются данные с table_1. Если table_1.status==0, то выполняются некоторые действия порядка 0.5 сек. и значение table_1.id записывается в table_2.

В этот период 0.5 сек. другой пользователь может также обработать этот запрос и получить тот же table_1.id, что не есть хорошо.

Как можно запретить/исключить с выборки этот table_1.id, чтобы в интервале долей секунды другой запрос не мог его подхватить?

Есть у кого нибудь какие-то мысли?

Sly32
На сайте с 29.03.2012
Offline
303
#1

транзакции использовать

V
На сайте с 10.01.2012
Offline
85
#2
Sly32:
транзакции использовать

Можно простой пример? Читал о блокировках и транзакция MySQL, но если прямо - не особо понимаю что и к чему.

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

Sly32
На сайте с 29.03.2012
Offline
303
#3
Varenik:
Читал о блокировках и транзакция MySQL

Сорри, я давно не работаю с мусклей, с постгрес и не буду вводить вас в заблуждение, лучше еше раз посмотрите доку. Блокировка должна работать вроде как сама, транзакции я использую только через ОРМ ДЖАНГО, вряд ли это будет вам полезно. Надеюсь тут найдутся кто более компетентные чем я в БД

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#4
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
V
На сайте с 10.01.2012
Offline
85
#5

Спасибо. Понял куда рыть для моей задачи нужно - Блокировка уровня строки🍿

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#6
Varenik:
Спасибо. Понял куда рыть для моей задачи нужно - Блокировка уровня строки🍿

Главное, чтобы InnoDB была, а не MyISAM

L
На сайте с 10.02.2015
Offline
221
#7

Вариант:

1. Стартуете транзакцию

2. SELECT c FOR UPDATE

3. Досыпаете 0,5 сек

4. Коммитите транзакцию

Если ждать нужно больше, да и вообще, то лучше:

вместо 3-го пункта делать UPDATE поля допустим locked_to и писать дату, до которой заблокировано

во втором пункте выбирать с условием, что поле locked_to меньше текущей даты

когда нужно, снимаем locked_to

Главное не наплодить взаимных блокировок

V
На сайте с 10.01.2012
Offline
85
#8

Сама выборка сложная с многочисленными JOIN

Aisamiery
На сайте с 12.04.2015
Offline
293
#9

У вас ошибка логики, блокировка на уровне строк и таблиц защищает от вставки и изменения данных, вам нужен другой механизм на уровне логики приложения, который не сможет взять нужный id если он уже обрабатывается

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#10
Aisamiery:
У вас ошибка логики, блокировка на уровне строк и таблиц защищает от вставки и изменения данных, вам нужен другой механизм на уровне логики приложения, который не сможет взять нужный id если он уже обрабатывается

Кстати да...

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

12 3

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий