我有一个具有此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个以上的线程始终更新不同的行?
没有 。当SQL Server要更新一行时,将UPDATE获得一个锁。这与其他锁兼容,例如共享锁(可读取),但与另一个更新锁 不 兼容。
UPDATE
因此,如果两个并发用户尝试更新同一行,则其中一个将“获胜”并获得UPDATE锁,而另一个用户/事务将不得不等到第一次更新完成。