我有一个具有此UPDATE查询的存储过程:
UPDATE TOP(1) Batch_tbl
SET locked = 1
OUTPUT inserted.batchId INTO #batchId
FROM Batch_tbl
WHERE locked = 0;
它更新locked = 0的第一行,并设置locked = 1。
如果我有多个线程,那么2个线程是否有可能更新同一行?假设一旦锁定1,锁定永远不会设置为0。
如果是这样,我怎样才能使2+个线程总是更新不同的行?
答案 0 :(得分:12)
否即可。当SQL Server想要更新行时,将获取UPDATE
锁。这与其他锁兼容,如共享锁(读取),但 NOT 与另一个更新锁兼容。
因此,如果两个并发用户尝试更新同一行,其中一个将“赢”并获得UPDATE
锁定,而另一个用户/事务将必须等到第一次更新完成。< / p>