SQL atomic выбирает неиспользуемый элемент из списка и размещает его в другой таблице - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть список каналов. Мне нужно использовать один из них, если он есть, и выделить его для сеанса. Если не осталось доступных, мне нужно создать новый и выделить его для сеанса и сообщить вызывающим подпрограммам, что это новый канал.

У меня есть следующая реализация, которая, кажется, работает, но мне было интересно, есть ли лучший способ сделать это.

PS. Это в SQL 2000, в противном случае я бы попытался использовать предложение вывода оператора обновления.

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 Ответ

1 голос
/ 21 декабря 2009

Я бы использовал updlock,holdlock,rowlock как минимум.

Также смотрите этот вопрос: Состояние гонки очереди процесса SQL Server

...