Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Есть задача при каждом обращении к функции PHP возвращать из базы уникальное значение ячейки и после этого его инкрементировать.
Честно, не знаю как заблокировать таблицу до изменения этого значения, чтоб не вернуть несколько раз одно и то же значение.
Попробовал написать так:
Неактивен
Здравствуйте.
select for update работает в транзакции. оберните в транзакцию Ваши два запроса (SELECT FOR UPDATE и UPDATE) и посмотрите на результат.
Активен
Спасибо.
Да, наверное. Попробую.
Неактивен
Спасибо.
Все получилось как нужно)
Неактивен
Отлично :-)!
Еще блокировки можно делать через
https://dev.mysql.com/doc/refman/5.7/en … tions.html
, тоже удобный механизм, советую пощупать.
Активен
В документации (MySQL) встречал еще один способ реализации подобного счетчика. Что-то наподобие UPDATE tab SET i=LAST_INSERT_ID(i+1), потом той же функцией выбираете установленное значение, при необходимости "декрементировав" его (в том же SELECT или на клиенте).
Неактивен
LAST_INSERT_ID() работает в рамках сессии и не видит значений из другой сессии, где тоже могут быть вставки в эту таблицу. так что так не стоит делать.
Активен
deadka написал:
LAST_INSERT_ID() работает в рамках сессии
В этом и фокус. Потом не из таблицы выбираете, а из "сессии".
Неактивен
deadka написал:
Отлично :-)!
Еще блокировки можно делать через
https://dev.mysql.com/doc/refman/5.7/en … tions.html
, тоже удобный механизм, советую пощупать.
Да, тоже можно, даже не в рамках транзакции. Не знал этот способ.
Но тот способ с FOR UPDATE мне больше понравился.)
Неактивен