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;
我必须确保每行只选择一次。如果多个用户需要优惠券代码,则SELECT
和UPDATE
之间的时间差很小。如果然后执行第二个SELECT
,则它可以第二次SELECT
同一行。我该如何预防?
答案 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