У меня есть список каналов. Мне нужно использовать один из них, если он есть, и выделить его для сеанса. Если не осталось доступных, мне нужно создать новый и выделить его для сеанса и сообщить вызывающим подпрограммам, что это новый канал.
У меня есть следующая реализация, которая, кажется, работает, но мне было интересно, есть ли лучший способ сделать это.
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