如果您可以将您的函数表述为单个UPDATE
语句,则不需要显式锁定 - 该UPDATE
语句将需要一个更新锁 ( U
),这是独占的,例如,没有两个读取器可以同时在同一行上获得更新锁。
UPDATE dbo.TableA
SET ManualID = CAST(CAST(ManualID AS INT) + 1 AS VARCHAR(20))
OUTPUT Inserted.ManualID -- return the newly inserted manual ID for your use
WHERE ..........
如果您需要一个两步过程 -SELECT
之前UPDATE
- 然后我会使用WITH (UPDLOCK)
提示SELECT
DECLARE @OldManualID VARCHAR(20)
BEGIN TRANSACTION
SELECT @OldManualID = ManualID
FROM dbo.TableA WITH (UPDLOCK)
WHERE........
-- do something with that manual ID
UPDATE dbo.TableA
SET ManualID = (new value of ManualID)
WHERE ..........
COMMIT TRANSACTION
在这两种情况下,由于单个 UPDATE 或 SELECT/UDPATE 在更新锁下运行,因此没有两个进程可以同时运行它。我认为您根本不需要任何进一步的锁定-绝对不是全表锁定....