Есть ли случай, когда эти две версии хранимой процедуры различны? Например, возникновение конфликта / тупика, или оно не является атомарным, или выходы могут быть отключены? Эта процедура просто для увеличения 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