Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Threadsafe UPDATE TOP 1 untuk Antrian FIFO

Kekhawatiran saya adalah duplikat [InvoiceID]
Beberapa permintaan cetak untuk [InvoiceID]

yang sama

Pada pembaruan pertama, SATU baris mendapat set [Status] = 'Printing'

Pada pembaruan kedua, semua baris [InvoiceID] mendapatkan set [Status] = 'Printed'
Ini bahkan akan mengatur baris dengan status ='draft'

Mungkin itu yang Anda inginkan

Proses lain dapat mengambil [InvoiceID] yang sama sebelum set [Status] = 'Print'

Jadi beberapa duplikat akan dicetak dan beberapa tidak akan

Saya pergi dengan komentar tentang penggunaan update lock

Ini non-deterministik tetapi Anda bisa mengambil top (1) dan lewati order by . Anda akan cenderung mendapatkan baris terbaru tetapi tidak dijamin. Jika Anda menghapus antrian maka Anda mendapatkan semuanya.

Ini menunjukkan Anda bisa kehilangan '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. Esensi dan penggunaan petunjuk NOLOCK di SQL Server

  2. Bagaimana cara saya membuat serial grafik besar objek .NET menjadi SQL Server BLOB tanpa membuat buffer besar?

  3. Tidak dapat melihat pemicu yang saya buat di SQL Server Management Studio 2008

  4. Bagaimana cara menyisipkan Massal dari ekstensi file XLSX?

  5. Batasan multiplisitas melanggar SQL Server 2008 - CodeFirst