【问题标题】:How not to select same row when selecting random records选择随机记录时如何不选择同一行
【发布时间】:2010-12-30 18:55:22
【问题描述】:

我有一张包含数万条记录的表,其中包含预先生成的代码。我每次都会给一个用户一个随机选择的代码。我选择一个代码并立即将其更新为“已使用”。我的问题是每隔一段时间就有两个用户得到相同的代码。是否有保证不给两个用户提供相同代码的方法?

这是我选择和更新所选代码的方式:

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;

【问题讨论】:

  • 为什么要预先生成代码?在发生时生成并提供给用户。
  • 您的随机选择不是从所有可用的未使用代码中统一选择的。这是故意的吗?
  • @Mark:我已经有这个条件了,只是忘了把它放在问题代码中抱歉。

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


【解决方案1】:

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

您还需要在您的 SELECT 查询中包含 WHERE used = 0,但我认为这已经涵盖了?

 ... WHERE some conditions AND ...

你也不希望那里没有锁。

【讨论】:

  • 如果两个事务选择了相同的代码会怎样?第二个会等待第一个锁释放并在释放后选择同一个吗?
【解决方案2】:
UPDATE MyCodes SET used = 1 WHERE code = @code and used=0

查看@@ROWCOUNT,如果为零,请做出不同的决定,抛出错误或重试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-31
    • 2011-04-08
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    相关资源
    最近更新 更多