假设你的事务隔离级别是默认的read committed,如果只是查询,不修改签到标记,可以使用table hint:
SELECT TOP 1 ID FROM A WITH (UPDLOCK, READPAST) WHERE 签到标记 = 0
这样做的效果是:
(1) 程序会去寻找一个未使用的账户的记录,并对其加更新锁(UPDLOCK),这样其它的进程就无法对它也加更新锁。
(2) 当程序读取到一条已经被其它进程加锁的记录时会自动跳过(READPAST)。
(3) 如果所有的帐户都已经被使用或被其它进程锁定,那么查询结果集为空。
如果你直接修改签到标记,那么一条UPDATE语句就可以了。
DECLARE @account_id INT
UPDATE TOP 1 A
SET 签到标记 = 1
, @account_id = id
WHERE 签到标记 = 0
然后把@account_id的值返回就可以了。