Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Threadsafe UPDATE TOP 1 cho Hàng đợi FIFO

Mối quan tâm của tôi là [InvoiceID]
Nhiều yêu cầu in cho cùng một [InvoiceID]

Trên bản cập nhật đầu tiên, MỘT hàng được set [Status] = 'Printing'

Trong lần cập nhật thứ hai, tất cả các hàng [InvoiceID] nhận được set [Status] = 'Printed'
Điều này thậm chí sẽ đặt các hàng có status ='nháp'

Có lẽ đó là những gì bạn muốn

Một quy trình khác có thể nhận cùng một [InvoiceID] trước set [Status] = 'Print'

Vì vậy, một số bản sao sẽ in và một số bản thì không

Tôi đưa ra nhận xét về việc sử dụng update lock

Điều này không mang tính xác định nhưng bạn chỉ có thể lấy top (1) và bỏ qua order by . Bạn sẽ có xu hướng nhận được hàng gần đây nhất nhưng nó không được đảm bảo. Nếu bạn xóa hàng đợi thì bạn sẽ có tất cả.

Điều này chứng tỏ bạn có thể mất 'bản nháp' =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. Cách kiểm soát những gì người dùng có thể giải mã Mã hóa khóa đối xứng SQL Server

  2. Làm cách nào để loại trừ Ngày cuối tuần trong truy vấn SQL Server?

  3. Điều kiện có điều kiện trong SQL Server

  4. làm thế nào để tách chuỗi thành các cột khác nhau?

  5. ADO .NET so với SQL Server Management Studio - ADO hoạt động kém hơn