如何锁定一行以便select只返回一次行?

时间:2015-12-17 14:38:57

标签: sql sql-server database tsql sql-server-2014

SQL业余爱好者。

我有一张包含优惠券代码的表格:

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

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

SELECT TOP 1 * FROM tableName WHERE UserId IS NULL;
UPDATE tableName SET UserId = @UserID WHERE id = @SelectedIdFromAboveSelect;

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

4 个答案:

答案 0 :(得分:7)

我想你可以按相反的顺序做到;我的意思是,您使用用户ID UPDATE表,然后使用SELECT voucherCode。这样你就不会有任何问题。

答案 1 :(得分:3)

您可以使用update子句返回output语句中的值来执行此操作:

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;

答案 2 :(得分:0)

你可以试试这个:

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和代码。

答案 3 :(得分:-2)

我认为这可能有所帮助:

SELECT DISTINCT * FROM tableName WHERE UserId IS NULL