SQL服务器:并发线程可以更新同一行吗?

时间:2013-12-05 20:28:16

标签: sql sql-server

我有一个具有此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+个线程总是更新不同的行?

1 个答案:

答案 0 :(得分:12)

即可。当SQL Server想要更新行时,将获取UPDATE锁。这与其他锁兼容,如共享锁(读取),但 NOT 与另一个更新锁兼容。

因此,如果两个并发用户尝试更新同一行,其中一个将“赢”并获得UPDATE锁定,而另一个用户/事务将必须等到第一次更新完成。< / p>