Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SQL Threadsafe UPDATE TOP 1 dla kolejki FIFO

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL konwertuje 'DDMMYY' na datetime

  2. Zwróć wartość przyrostu kolumny tożsamości w SQL Server

  3. Co oznacza exec sp_reset_connection w programie Sql Server Profiler?

  4. Dlaczego warto korzystać z Select Top 100 procent?

  5. Jak mogę wyczyścić pamięć podręczną zapytań programu SQL Server?