By putting the update straight after the read is enough. You need to do more. Check this script out to illustrate my point...
create table Numbers (LastNumber int not null, primary key(LastNumber))
insert into Numbers values (0)
Now create 2 connections to the database and run the following script on each one at the same time. (This will simulate 20000 requests for next number in a short period of time)
set nocount on
declare @LastNumber int
declare @NewNumber int
declare @Count int
declare @Index int
select @Count=10000, @Index=1
while (@Index <= @Count)
Select @LastNumber = LastNumber From Numbers
Select @NewNumber = @LastNumber + 1
Update Numbers Set LastNumber = @NewNumber
select @Index= @Index + 1
Select LastNumber From Numbers
When I run this on my local tempdb, I get the result as 17209. This means that there were 2791 duplicate next numbers generated! Obviously you may not have the demand of 20000 instantaneous requests, but it only needs to happen once to corrupt your data integrity.
Now change the script to either use transactions, or include the LastNumber in a where clause of the update statement (as mentioned in my previous post) to correct the problem.