sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Threadsafe OPDATERING TOP 1 til FIFO-kø

Min bekymring ville være duplikat [InvoiceID]
Flere udskriftsanmodninger for det samme [InvoiceID]

Ved den første opdatering får EN række set [Status] = 'Printing'

Ved den anden opdatering bliver alle [InvoiceID] rækker set [Status] = 'Printed'
Dette ville endda sætte rækker med status ='draft'

Måske er det det, du ønsker

En anden proces kunne hente det samme [InvoiceID] før set [Status] = 'Print'

Så nogle dubletter udskrives, og nogle vil ikke

Jeg går med kommentarer til brug af update lock

Dette er ikke-deterministisk, men du kan bare tage top (1) og spring over order by . Du vil have tendens til at få den seneste række, men det er ikke garanteret. Hvis du rydder køen, får du dem alle.

Dette viser, at du kan miste '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. Optælling baseret på tilstand i SQL Server

  2. Ingen data fundet, eller der opstod en undtagelsesfejl for mange rækker under indsættelse af masseregistrering

  3. Sådan oprettes og implementeres Azure Database til MySQL Server ved hjælp af Azure Portal og Workbench

  4. skråstreg før hvert citatproblem