我使用以下查询来获取未使用代码的数量--AvailableCodes
表中不在Usage
表中的代码:
SELECT code, type
FROM
(
SELECT avc.code, avc.type,
COUNT(CASE WHEN avc.type = 'type_1' THEN 1 END) OVER () cn1,
COUNT(CASE WHEN avc.type = 'type_3' THEN 1 END) OVER () cn2,
ROW_NUMBER() OVER (PARTITION BY avc.type ORDER BY avc.id) rn
FROM AvailableCodes avc left JOIN Usage usg
ON usg.code = avc.code
WHERE usg.code IS NULL
) t
WHERE (cn1 >= 2 AND cn2 >= 1) AND
((type = 'type_1' AND rn <= 2) OR (type = 'type_3' AND rn <= 1))
ORDER BY type, code
我希望锁定读取选定的行,但允许读取其他代码,以防多个用户同时try 访问此代码.
但我不确定将锁定部分放在哪里,with(rowlock, updlock, holdlock)
的方式将仅锁定AvailableCodes
中选定的行以供读取,但允许读取其他行.
Update:更清楚地说,我真正需要做的是:
在上面的查询之后,我得到了一个需要插入到Usage
表中的代码数组,例如:['111', '222', '1232']
.
然后我需要将它们插入到Usage
,这样其他用户就不会再次使用这些代码.
在上面的查询之后,我在同一查询中批量插入了它们.
Update 2:
我正在try 实现的是一个系统,用户可以在其中 Select 每种类型的折扣代码数量.例如,他们想要type_1
中的5个代码,type_2
中的3个代码,type_3
中的10个代码.
并且每个代码不应该被多次使用.
因此,我的查询批量 Select 可用的代码并将其批量插入