Если вы можете сформулировать свою функцию как один оператор 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 выполняются при блокировке обновления, никакие два процесса не могут запускать это одновременно.Я не думаю, что вам вообще нужна дополнительная блокировка - определенно не полная блокировка таблицы ....