Mối quan tâm của tôi là [InvoiceID]
Nhiều yêu cầu in cho cùng một [InvoiceID]
Trên bản cập nhật đầu tiên, MỘT hàng được set [Status] = 'Printing'
Trong lần cập nhật thứ hai, tất cả các hàng [InvoiceID] nhận được set [Status] = 'Printed'
Điều này thậm chí sẽ đặt các hàng có status ='nháp'
Có lẽ đó là những gì bạn muốn
Một quy trình khác có thể nhận cùng một [InvoiceID] trước set [Status] = 'Print'
Vì vậy, một số bản sao sẽ in và một số bản thì không
Tôi đưa ra nhận xét về việc sử dụng update lock
Điều này không mang tính xác định nhưng bạn chỉ có thể lấy top (1)
và bỏ qua order by
. Bạn sẽ có xu hướng nhận được hàng gần đây nhất nhưng nó không được đảm bảo. Nếu bạn xóa hàng đợi thì bạn sẽ có tất cả.
Điều này chứng tỏ bạn có thể mất 'bản nháp' =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