Итак, у меня есть две хранимые процедуры на моем SQL сервере. Один выбирает номер из моей таблицы, а другой увеличивает число выбранных ячеек на единицу.
В настоящее время в SP есть только один вызывающий абонент, но в будущем их может быть больше.
Итак Мне интересно, есть ли у меня несколько абонентов (все с одной и той же учетной записью) для SP, могу ли я получить один и тот же номер несколько раз?
Эта тема заставляет меня поверить, что это это возможно, но не потому, что я также редактирую данные, и сервер не будет пытаться редактировать данные из нескольких вызовов.
Мой текущий SP:
dbo.GetNextNumber
USE [NumberProvider]
GO
/****** Object: StoredProcedure [dbo].[GetNextNumber] Script Date: 30.3.2020 08:58:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GetNextNumber]
-- Add the parameters for the stored procedure here
@SchemeId int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Select next number.
SELECT NextNum
FROM dbo.NumberingSchemes
WHERE Id = @SchemeId
-- Increase number by one.
EXEC dbo.UpdateNumber @SchemeId
END
dbo.UpdateNumber
USE [NumberProvider]
GO
/****** Object: StoredProcedure [dbo].[UpdateNumber] Script Date: 30.3.2020 09:13:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[UpdateNumber]
-- Add the parameters for the stored procedure here
@SchemeId int
AS
BEGIN
SET NOCOUNT ON;
-- Update number
UPDATE dbo.NumberingSchemes
SET NextNum = NextNum + 1
WHERE Id = @SchemeId
END
Итак, я думаю, что-то вроде этого лучше?
USE [NumberProvider]
GO
/****** Object: StoredProcedure [dbo].[UpdateNumber] Script Date:
27.3.2020 21:10:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[UpdateNumber]
-- Add the parameters for the stored procedure here
@SchemeId int
AS
BEGIN
BEGIN TRANSACTION;
SAVE TRANSACTION MySavePoint;
SET NOCOUNT ON;
BEGIN TRY
UPDATE dbo.NumberingSchemes
SET NextNum = NextNum + 1
WHERE Id = @SchemeId
SELECT NextNum
FROM dbo.NumberingSchemes
WHERE Id = @SchemeId;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION MySavePoint; -- rollback to MySavePoint
END
END CATCH
END
Редактировать 1:
Чтобы уточнить, Я использую это для создания схем нумерации, которые внешние приложения используют для распределения уникальных номеров. Мне нужно только отслеживать следующий номер, который будет дан.
Это мой дизайн таблицы, и мне может понадобиться добавить другие схемы в таблицу.
Таблица Дизайн