选择随机记录时如何不选择同一行

时间:2010-12-30 08:55:49

标签: sql-server sql-server-2005 tsql

我有一张包含数万条记录的表格,这些记录有预先生成的代码。我每次都会向用户提供一个随机选择的代码。我选择一个代码并立即将其更新为“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;

2 个答案:

答案 0 :(得分:1)

您可以在事务中运行这两个语句,并且只有在提交事务成功时才将代码提供给用户。

您还需要在SELECT查询中使用WHERE used = 0,但我认为这包括在内?

 ... WHERE some conditions AND ...

你也不希望那里没有锁定。

答案 1 :(得分:0)

UPDATE MyCodes SET used = 1 WHERE code = @code and used=0

请参阅@@ROWCOUNT,如果它为零,则做出不同的决定,抛出错误或再试一次