Moim zmartwieniem byłoby zduplikowanie [Identyfikatora faktury]
Wiele żądań drukowania tego samego [Identyfikatora faktury]
Przy pierwszej aktualizacji JEDEN wiersz otrzymuje set [Status] = 'Printing'
Przy drugiej aktualizacji wszystkie wiersze [InvoiceID] otrzymują set [Status] = 'Printed'
To nawet ustawiłoby wiersze ze statusem =„szkic”
Może właśnie tego chcesz
Inny proces może pobrać ten sam [InvoiceID] przed set [Status] = 'Print'
Tak więc niektóre duplikaty zostaną wydrukowane, a inne nie
Idę z komentarzami na temat korzystania z update lock
Nie jest to deterministyczne, ale możesz po prostu wziąć top (1)
i pomiń order by
. Będziesz mieć tendencję do uzyskiwania najnowszego wiersza, ale nie jest to gwarantowane. Jeśli wyczyścisz kolejkę, otrzymasz je wszystkie.
To pokazuje, że możesz stracić „szkic” =1
declare @invID int;
declare @T table (iden int identity primary key, invID int, status tinyint);
insert into @T values (1, 2), (5, 1), (3, 1), (4, 1), (4, 2), (2, 1), (1, 1), (5, 2), (5, 2);
declare @iden int;
select * from @t order by iden;
declare @rowcount int = 1;
while (@ROWCOUNT > 0)
begin
update top (1) t
set t.status = 3, @invID = t.invID, @iden = t.iden
from @t t
where t.status = '2';
set @rowcount = @@ROWCOUNT;
if(@rowcount > 0)
begin
select @invID, @iden;
-- do stuff
update t
set t.status = 4
from @t t
where t.invID = @invID; -- t.iden = @iden;
select * from @T order by iden;
end
end