SELECT
在读取的行上放置共享锁,然后可以在READ COMMITED
隔离模式下解除共享锁。
UPDATE
将更新锁升级为排他锁。直到交易结束它们才被解除。
您应将锁放置后立即保留。
您可以通过设置事务隔离级别来做到这一点,该级别REPEATABLE READ
将保留共享锁直到事务结束,并防止UPDATE
部分锁定这些行。
或者,您可以按以下方式重写查询:
WITH q AS
(
SELECT TOP 10000 *
FROM mytable WITH (ROWLOCK, READPAST)
WHERE batch_id IS NULL
ORDER BY
date
)
UPDATE q
SET batch_id = @myid
,这只会跳过锁定的行。