Я хочу создать уникальный номер из таблицы.
Конечно, она должна быть поточно-ориентированной, поэтому, когда я проверяю последний номер и получаю «3», а затем сохраняю «4» в базе данных, я не хочу, чтобы кто-то еще находился между этими двумя действиями (получите номер и сохранить его на один уровень выше в базе данных) также, чтобы получить «3» обратно, а затем также сохранить «4»
Итак, я подумал, поместите это в транзакцию, как это:
begin transaction
declare @maxNum int
select @maxNum = MAX(SequenceNumber) from invoice
where YEAR = @year
if @maxNum is null
begin
set @maxNum = 0
end
set @maxNum = @maxNum + 1
INSERT INTO [Invoice]
([Year]
,[SequenceNumber]
,[DateCreated])
VALUES
(@year
,@maxNum
,GETUTCDATE()
)
commit transaction
return @maxNum
Но мне стало интересно, достаточно ли этого, чтобы положить его в сделку?
Моей первой мыслью было: он блокирует этот sp для использования другими людьми, но так ли это? Как SQL Server может знать, что заблокировать на первом шаге?
Будет ли эта конструкция гарантировать мне, что никто другой не выполнит часть select @maxnum
только тогда, когда я получу updating the @maxnum
значение, и в тот момент получаю то же самое @ maxnum
, что и я, так что я попал в беду.
Я надеюсь, вы понимаете, чего я хочу достичь, а также, если вы знаете, выбрал ли я правильное решение.
EDIT:
также описывается как «Как однопоточную хранимую процедуру»