sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Threadsafe UPPDATERING TOP 1 för FIFO-kö

Min oro skulle vara dubbletter av [InvoiceID]
Flera utskriftsförfrågningar för samma [InvoiceID]

Vid den första uppdateringen får EN rad set [Status] = 'Printing'

Vid den andra uppdateringen får alla [InvoiceID]-rader set [Status] = 'Printed'
Detta skulle till och med ställa in rader med status ='utkast'

Kanske är det det du vill ha

En annan process kan hämta samma [InvoiceID] före set [Status] = 'Print'

Så vissa dubbletter kommer att skrivas ut och andra inte

Jag går med kommentarer om att använda update lock

Detta är icke-deterministiskt men du kan bara ta top (1) och hoppa över order by . Du tenderar att få den senaste raden men det är inte garanterat. Om du rensar kön får du alla.

Detta visar att du kan förlora 'draft' =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


  1. Kan inte ansluta till MySQL-servern på "localhost" (10061)

  2. Bootstrappa SQL Express från WiX?

  3. Får ett fel med funktionen mysqli_escape_string

  4. Maximal tabellstorlek för en MySQL-databas