Как запретить нескольким веб-запросам обрабатывать одни и те же записи? - PullRequest
0 голосов
/ 07 октября 2009

Допустим, у вас есть таблица с несколькими выигрышными номерами. Любое из этих чисел должно быть «выиграно» только одним человеком.

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

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

Есть ли какой-либо другой общий шаблон, который можно применить к этому?

Ответы [ 3 ]

6 голосов
/ 07 октября 2009

Эти числа генерируются случайным образом или что-то?

Я бы опирался на семантику транзакций в самой базе данных: создайте таблицу с двумя столбцами, номером и заявкой и используйте одно обновление:

UPDATE winners SET claimed=1 WHERE claimed=0 AND number=@num;

Затем проверьте количество затронутых строк.

1 голос
/ 07 октября 2009

Использование транзакций. Вы никогда не должны иметь несколько потоков или процессов, изменяющих одни и те же данные без транзакционных блокировок, и любая приличная база данных сегодня поддерживает транзакции. Запустите транзакцию, «захватите» выигрышный номер, а затем подтвердите. Другой поток будет заблокирован до фиксации и получит свой шанс только после обновления записей, когда сможет увидеть, что он уже там.

0 голосов
/ 07 октября 2009

Решением, не связанным с базой данных, может быть то, что клиент выполнит запрос асинхронно, а затем отправит запрос в очередь FIFO для управления запросами, чтобы только один запрос за раз получал оценку. Затем ответьте клиенту, когда оценка будет завершена. Преимущество здесь состоит в том, что при высокой нагрузке пользовательский интерфейс не будет заморожен там, где он будет с транзакционной блокировкой на уровне базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...