Есть ли функциональная разница между этими двумя хранимыми процедурами? - PullRequest
0 голосов
/ 22 октября 2019

Есть ли случай, когда эти две версии хранимой процедуры различны? Например, возникновение конфликта / тупика, или оно не является атомарным, или выходы могут быть отключены? Эта процедура просто для увеличения int и возврата значения предварительного приращения. На мой взгляд, они оба правильно блокируют строку и возвращают результат в случае, если процедура выполняется несколько раз в одно и то же время.

РЕДАКТИРОВАТЬ: я забыл упомянуть, что не ищу альтернативного решения. Я просто ищу подробное объяснение тонкостей запросов и их различий в терминах транзакций и атомарности. Это больше, чтобы узнать, что делать / что не делать в этих сценариях в будущем.

@LocationCode nvarchar(131),
@VID int OUTPUT
BEGIN TRANSACTION

UPDATE NextVID WITH (ROWLOCK)
SET NextVID = NextVID + 1, 
    @VID = NextVID
WHERE LocationCode = @LocationCode;

COMMIT TRANSACTION

против

BEGIN TRANSACTION

SELECT 
    @VID = NextVID
FROM NextVID WITH (UPDLOCK, ROWLOCK)
WHERE LocationCode = @LocationCode;

UPDATE NextVID
SET NextVID = NextVID + 1
WHERE LocationCode = @LocationCode;

COMMIT TRANSACTION
...