1

这是我的标量函数:

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 个用户可以执行此功能,而其余用户则等待?

4

2 回答 2

2

您的函数中绝对没有任何内容可以使它为两个相同的并发调用返回不同的值。如果需要防止并发,可以使用应用锁。这是针对 SQL Server 2005 的,SQL Server 2012 中可能有更新的东西。

于 2013-03-04T06:56:01.970 回答
1

您可以使用 UPDLOCK 提示。UPDLOCK 提示告诉 SQL Server 引擎“如果此行获取 UPDATE(lock"U"),则不允许任何其他读取,因为我会。UPDLOCK 保持锁定直到语句或事务结束。

函数体中的 select 语句:

Select Top 1 @FilingNumber = FilingNumber
From Documents WITH(UPDLOCK)
Where ParentDocumentID = @ParentDocumentID
Order By FilingNumber desc
于 2013-03-04T10:49:07.867 回答