sql >> Database >  >> RDS >> Sqlserver

SQL Threadsafe UPDATE TOP 1 voor FIFO-wachtrij

Mijn zorg zou zijn dubbele [InvoiceID]
Meerdere afdrukverzoeken voor dezelfde [InvoiceID]

Bij de eerste update krijgt EEN rij set [Status] = 'Printing'

Bij de tweede update krijgen alle [InvoiceID]-rijen set [Status] = 'Printed'
Dit zou zelfs rijen instellen met status ='draft'

Misschien is dat wat je wilt

Een ander proces kan dezelfde [InvoiceID] ophalen vóór de set [Status] = 'Print'

Sommige duplicaten worden dus afgedrukt en andere niet

Ik ga met opmerkingen over het gebruik van het update lock

Dit is niet-deterministisch, maar u kunt gewoon top (1) . nemen en sla de order by over . U krijgt meestal de meest recente rij, maar dit is niet gegarandeerd. Als je de wachtrij leegmaakt, krijg je ze allemaal.

Dit laat zien dat je 'draft' =1 kunt verliezen

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


  1. Waarom eindigt de instructie While (rs.next()) na de eerste iteratie?

  2. JDBC kan geen verbinding maken met mysql-database op openshift

  3. Kenmerken van een rapport

  4. Recursie gebruiken om navigatie te bouwen