我有一张包含数万条记录的表格,这些记录有预先生成的代码。我每次都会向用户提供一个随机选择的代码。我选择一个代码并立即将其更新为“used”。我的问题是每隔一段时间两个用户获得相同的代码。是否有保证不给两个用户提供相同代码的方法?
这是我选择和更新所选代码的方式:
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;
答案 0 :(得分:1)
您可以在事务中运行这两个语句,并且只有在提交事务成功时才将代码提供给用户。
您还需要在SELECT查询中使用WHERE used = 0
,但我认为这包括在内?
... WHERE some conditions AND ...
你也不希望那里没有锁定。
答案 1 :(得分:0)
UPDATE MyCodes SET used = 1 WHERE code = @code and used=0
请参阅@@ROWCOUNT
,如果它为零,则做出不同的决定,抛出错误或再试一次