Как не выбирать ту же строку при выборе случайных записей - PullRequest
1 голос
/ 30 декабря 2010

У меня есть таблица с десятками тысяч записей с предварительно сгенерированными кодами. Я даю один случайно выбранный код пользователю каждый раз. Я выбираю один код и немедленно обновляю его как «использованный». Моя проблема в том, что время от времени два пользователя получают один и тот же код. Есть ли гарантированный способ не давать двум пользователям одинаковый код?

Вот как я выбираю и обновляю выбранный код:

SELECT TOP 1 @code = code FROM MyCodes WITH (NOLOCK) WHERE used = 0 and some other conditions
 AND 0.01 >= CAST(CHECKSUM(NEWID(), code) & 0x7fffffff AS FLOAT) / CAST (0x7fffffff AS INT);

UPDATE MyCodes SET used = 1 WHERE code = @code;

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Вы можете выполнить оба оператора в транзакции и только дать код пользователю, если фиксация транзакции завершится успешно.

Вам также нужно иметь WHERE used = 0 в вашем запросе SELECT, но я предполагаю, что это покрытоэтим?

 ... WHERE some conditions AND ...

Также вы не хотите, чтобы никакой блокировки там не было.

0 голосов
/ 30 декабря 2010
UPDATE MyCodes SET used = 1 WHERE code = @code and used=0

см. @@ROWCOUNT и, если он равен нулю, примите другое решение, сгенерируйте ошибку или попробуйте снова

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