如何锁定一行以便 select returns 一行恰好一次?

How to lock a row so that a select returns a row exactly once?

SQL业余爱好者

我有一个 table 包含优惠券代码:

id  voucherCode  UserId
------------------------
1   abcde        13
2   bcdef        11
3   cdefg
4   defgh

现在,如果我的一位用户有资格获得优惠券代码,我会从我的 table:

那里获得一个
SELECT TOP 1 * FROM tableName WHERE UserId IS NULL;
UPDATE tableName SET UserId = @UserID WHERE id = @SelectedIdFromAboveSelect;

我必须确保每一行只被选中 一次。如果多个用户需要优惠券代码,SELECTUPDATE 之间会有一个小的时间间隔。如果然后执行第二个 SELECT,它可能会 SELECT 同一行第二次。我该如何预防?

我想你可以按相反的顺序做;我的意思是,您 UPDATE 带有用户 ID 的 table,然后 SELECT 优惠券代码。这样你应该没有问题。

您可以通过使用 output 子句在 update 语句中返回值来完成此操作:

declare @ids table (userid int);

with toupdate as (
      SELECT TOP 1 *
      FROM tableName
      WHERE UserId IS NULL
     )
UPDATE toupdate
    SET UserId = @UserId
    OUTPUT inserted.UserId INTO @ids;

你可以试试这个:

UPDATE t
SET userid = 99
OUTPUT inserted.id, inserted.vouchercode
FROM tablename t
WHERE userid IS NULL
AND id = (SELECT MIN(id) 
          FROM tablename 
          WHERE userid IS NULL)

OUTPUT 仅用于获取您实际选择的 ID 和代码。

我认为这可能有帮助:

SELECT DISTINCT * FROM tableName WHERE UserId 为 NULL