- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Aisamiery, я тоже хотел написать, что здесь, mutex или что-то подобное должно быть, но все так уверенно начали советовать транзакции, что я начал верить в этом сам :)
И по-хорошему, нужно бы дополнительную информацию от ТС, что должен получить второй пользователь, который полез "невовремя". В первом посте об этом не говорится, а тут могут быть нюансы.
Aisamiery, я тоже хотел написать, что здесь, mutex или что-то подобное должно быть, но все так уверенно начали советовать транзакции, что я начал верить в этом сам :)
Транзакции - это механизм целостности, который гарантирует, что если не выполнился один запрос, то не выполнятся и все остальные, на селекты он как то мало применим.
Aisamiery, я тоже хотел написать, что здесь, mutex или что-то подобное должно быть, но все так уверенно начали советовать транзакции, что я начал верить в этом сам :)
И по-хорошему, нужно бы дополнительную информацию от ТС, что должен получить второй пользователь, который полез "невовремя". В первом посте об этом не говорится, а тут могут быть нюансы.
Второй также должен получить table_1.id, только отличительный от того что уже выбран у первого пользователя.
Второй также должен получить table_1.id, только отличительный от того что уже выбран у первого пользователя.
Вам нужно организовать очередь любыми средствами которые вас устроят. Для начала опишите задачу по конкретнее которую вы решаете, мы попробуем подсказать более элегантное решение в вашем случае
Можно в table1 сделать поле lock, и воспользоваться select for update, выставляя это в поле 1, а у клиентов делать выборку на status = 0 and lock = 0 (да не забудьте тут про транзакции для них они нужны https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html)
Там поле не нужно, SELECT FOR UPDATE не даст прочитать данные из другой транзакции, пока выбравшая для апдейта не сделает коммит.
Этот вариант правильный:
Вариант:
1. Стартуете транзакцию
2. SELECT c FOR UPDATE
3. Досыпаете 0,5 сек
4. Коммитите транзакцию
Если поле использовать, то любой уровень изоляции который исключит DIRTY WRITES, в MySQL это read committed и выше.
Второй также должен получить table_1.id, только отличительный от того что уже выбран у первого пользователя.
Генерируете UUID, пишете его в выделенное для этого поле нужной записи + возможно, в отдельное поле время когда этот UUID устареет. Затем что хотите делаете с этим полем по этому UUID'у обновляете данные + меняете статус на = 1 + затираете UUID и дату (если нужно). Если есть желание заверните это всё в транзакцию.
Для начала опишите задачу по конкретнее которую вы решаете, мы попробуем подсказать более элегантное решение в вашем случае
Вот собственно код (не весь - внутри есть еще обработчики). Частично задача решилась, но Немного баги встречаются в других выборках, связанных с таблицей
Буду признателен за дельный совет
Нет дельных мыслей обхода моей рукожопости?
Нет дельных мыслей обхода моей рукожопости?
по вашему коду не очень понятно если честно. Почему бы вам не обрабатывать это в единый поток, например скриптом консоли? или вам нужен ответ пользователю?
по вашему коду не очень понятно если честно. Почему бы вам не обрабатывать это в единый поток, например скриптом консоли? или вам нужен ответ пользователю?
Мало того что нужен ответ пользователю, так еще и на приеме есть данные, на основе которых идут выборки.