这是我的标量函数:
ALTER FUNCTION [dbo].[GetInstrumentID]
(
@ParentDocumentID int
)
RETURNS varchar(14)
AS
BEGIN
Declare @InstrumentID varchar(14) = ''
Declare @FilingNumber int = 0
Select @InstrumentID = InstrumentID
From Documents
Where DocumentID = @ParentDocumentID
Select Top 1 @FilingNumber = FilingNumber
From Documents Where ParentDocumentID = @ParentDocumentID
Order By FilingNumber desc
Set @InstrumentID = Left(@InstrumentID,9) + Right(
'000' + Cast((IsNull(@FilingNumber,1) + 1) as varchar(3))
, 3) + '00'
Return @InstrumentID
END
我担心如果有100个用户调用此函数,是否有可能其中许多用户收到相同的返回值?如果是,那么如何确保一次只有1个用户执行此功能,其余的等待?
答案 0 :(得分:2)
您的函数中绝对没有任何内容可以使它为两个相同的并发调用返回不同的值。如果需要防止并发,可以使用application locks。这适用于SQL Server 2005,SQL Server 2012中可能有更新的东西。
答案 1 :(得分:1)
您可以使用UPDLOCK提示。 UPDLOCK提示告诉SQL Server引擎“如果此行获取UPDATE(锁定”U“),则不允许任何其他读取,因为我将.UPDLOCK保持锁定直到语句或事务结束。
在函数体中选择语句:
Select Top 1 @FilingNumber = FilingNumber
From Documents WITH(UPDLOCK)
Where ParentDocumentID = @ParentDocumentID
Order By FilingNumber desc