如何锁定一行以便 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;
我必须确保每一行只被选中 一次。如果多个用户需要优惠券代码,SELECT
和 UPDATE
之间会有一个小的时间间隔。如果然后执行第二个 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
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;
我必须确保每一行只被选中 一次。如果多个用户需要优惠券代码,SELECT
和 UPDATE
之间会有一个小的时间间隔。如果然后执行第二个 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