Защита ссылок от множества одновременных кликов

Рейтинг: 2Ответов: 1Опубликовано: 04.04.2015

Есть ссылка. Она выполняет какое-либо определенное действие. Схема её работы проста:

  1. Делает запрос в БД. Если совпадение найдено, то
  2. Изменяет какую-либо информацию о пользователе в соседней таблице.
  3. Удаляет информацию о ее существовании из первой таблицы, в которой мы совершали проверку.

А теперь проблема: если нажать на ссылку 1 раз а затем еще 100 раз пока загружается страница, то и ссылка сработает 100 раз, не успев удалить себя из БД. Кто что расскажет вообще о способах защиты против этого?

P.S. Был очень удивлен, зайдя на привычный мне хешкод и увидевши перед собой менее привычный стековерфлоу с поддоменом ru. :D

Ответы

▲ 1Принят

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

В качестве дополнения вы можете добавить отключение ссылки на стороне клиента, чтобы избежать случайных повторных запросов. Но это именно в качестве дополнения, лишь чтобы пользователю было удобнее.