2009-12-21 3 views
0

나는 채널 목록을 가지고 있습니다. 이 중 하나가있을 경우 사용할 수있는 하나를 사용하여 세션에 할당해야합니다. 사용할 수있는 것들이 남아 있지 않으면 새로운 것을 생성하고 그것을 세션에 할당하고, 호출 루틴이 그것이 새로운 채널이라는 것을 알게해야합니다.SQL atomic 목록에서 사용하지 않은 항목을 선택하고 다른 테이블에 할당합니다.

나는 작동하는 것처럼 보이는 다음과 같은 구현이 있지만, 더 나은 방법이 있는지 궁금합니다.

추신. 이것은 SQL 2000에 있습니다. 그렇지 않으면 update 문의 output 절을 사용하려고했을 것입니다.

create procedure [dbo].[ReserveChannelSession] 
(
    @ID      int   output 
    ,@ApplicationID   int 
    ,@ChannelID    int   output 
    ,@IsNewChannel   bit   output 
) 
as 
begin 
    begin transaction 
     set nocount on 
     set @ChannelID = (select top 1 [ID] from [dbo].[Channels] with (updlock,holdlock) where [InUse] = 0) 
     if @ChannelID is null 
     begin 
      exec InsertChannel @ID = @ChannelID output , @InUse = 1 -- create as reserved in use 
      set @IsNewChannel = 1; 
     end else begin 
      update [dbo].[Channels] set [InUse] = 1 where [ID] = @ChannelID 
      set @IsNewChannel = 0; 
     end 
     set nocount off 

     if @ChannelID is not null 
     begin 
      insert into [dbo].[ChannelSessions] (
       [ApplicationID] 
       ,[ChannelID] 
      ) values (
       @ApplicationID 
       ,@ChannelID 
      ) 
      set @ID=SCOPE_IDENTITY() 
     end 
    commit transaction 
end 

답변

1

최소한 updlock,holdlock,rowlock을 사용합니다.

이 질문을 참조하십시오 : SQL Server Process Queue Race Condition

+0

감사합니다. 그게 내가 필요로했던 것과 똑같은 트릭을 만들어 냈다. –

관련 문제