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

何百人ものユーザーがこの関数を呼び出すと心配ですが、それらの多くが同じ戻り値を受け取る可能性はありますか? はいの場合、一度に1人のユーザーのみがこの関数を実行し、残りのユーザーが待機するようにするにはどうすればよいですか?

4

2 に答える 2

2

関数には、2つの同一の同時呼び出しに対して異なる値を返すようなものはまったくありません。同時実行を防ぐ必要がある場合は、アプリケーションロックを使用できます。これはSQLServer2005の場合であり、SQLServer2012には新しいものがある可能性があります。

于 2013-03-04T06:56:01.970 に答える
1

UPDLOCKヒントを使用できます。UPDLOCKヒントは、SQL Serverエンジンに「この行がUPDATE(lock "U")を取得する場合は、他の読み取りを許可しないでください。UPDLOCKは、ステートメントまたはトランザクションが終了するまでロックを保持します。

関数本体のステートメントを選択します。

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