在不锁定表的情况下读取批量记录和更新单个记录的最佳方法

问题描述

这是我的代码,我正在寻找在更新时不锁定记录的最佳方法

Declare @maxRowId int
Set @maxRowId=0
Declare @rowIndex int
Set @rowIndex=1
Declare @recordId bigint
Set @recordId=0

    Begin Try
        Declare @ReservedTickets table(RowId int,Id bigint,TicketCodeId nvarchar(100),Status nvarchar(100),DateTimeReserved datetime)

        insert into @ReservedTickets
            select ROW_NUMBER() OVER (ORDER BY Id) RowId,Id,TicketCodeId,Status,DateTimeReserved 
                from [dbo].[Ticket] with(nolock) 
                where status='reserved' and 
                datetimeReserved <= DATEADD(minute,-30,getdate())
        select @maxRowId=max(RowId) from @ReservedTickets

        
        while @rowIndex<=@maxRowId
        BEGIN
         Select @recordId=Id from @ReservedTickets where Rowid=@rowIndex
        
        Begin TRAN
            UPDATE upd_Ticket   
              set 
                  upd_Ticket.Status='available',upd_Ticket.DateTimeReserved=null,RequestReference=null
              from [dbo].[Ticket] upd_Ticket
              INNER JOIN [dbo].[Ticket] slct_Ticket with(nolock)
                ON upd_Ticket.Id = slct_Ticket.Id
                where slct_Ticket.Id= @recordId and                 
                slct_Ticket.status='reserved' and 
                slct_Ticket.datetimeReserved <= DATEADD(minute,getdate())     

                
                
                
Commit TRAN
set @rowIndex=@rowIndex+1
        END
        select RV.Id,RV.status 'InitialStatus',V.status 'UpdatedStatus',RV.DateTimeReserved
                from @ReservedTickets RV 
                Left join [dbo].[Ticket] V on 
                RV.Id=v.Id

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)