Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Threadsafe АКТУАЛИЗАЦИЯ TOP 1 за FIFO Queue

Притеснението ми е дубликат [InvoiceID]
Множество заявки за печат за един и същ [InvoiceID]

При първата актуализация ЕДИН ред получава set [Status] = 'Printing'

При втората актуализация всички редове [InvoiceID] получават set [Status] = 'Printed'
Това дори ще зададе редове със статус ='чернова'

Може би това е, което искате

Друг процес може да вземе същия [InvoiceID] преди set [Status] = 'Print'

Така че някои дубликати ще се отпечатат, а други не

Отивам с коментари относно използването на update lock

Това не е детерминистично, но можете просто да вземете top (1) и пропуснете order by . Ще се стремите да получите най-новия ред, но това не е гарантирано. Ако изчистите опашката, получавате всички.

Това показва, че можете да загубите '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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Посоченият модул не може да бъде намерен. Изключение от HRESULT:0x8007007E

  2. Как да активирате улавянето на промяна на данни (CDC) в база данни в SQL Server - урок за SQL Server

  3. Свързване към SQL Server LocalDB чрез JDBC

  4. Как да съхранявам десетични стойности в SQL Server?

  5. CLR строга сигурност на SQL Server 2017