Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 此查询需要锁定吗?_Sql_Sql Server_Tsql_Locking_Sql Server 2012 - Fatal编程技术网

Sql 此查询需要锁定吗?

Sql 此查询需要锁定吗?,sql,sql-server,tsql,locking,sql-server-2012,Sql,Sql Server,Tsql,Locking,Sql Server 2012,这是我的标量函数: ALTER FUNCTION [dbo].[GetInstrumentID] ( @ParentDocumentID int ) RETURNS varchar(14) AS BEGIN Declare @InstrumentID varchar(14) = '' Declare @FilingNumber int = 0 Select @InstrumentID = InstrumentID From Docum

这是我的标量函数:

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多个用户调用这个函数,他们中的许多人会收到相同的返回值吗?如果是,那么我如何确保一次只有一个用户执行此函数,其余用户等待?

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

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

函数体中的Select语句:

Select Top 1 @FilingNumber = FilingNumber
From Documents WITH(UPDLOCK)
Where ParentDocumentID = @ParentDocumentID
Order By FilingNumber desc

怎么做?我是通过FilingNumber进行排序,然后将该数字增加1。如果有10个用户呼叫,我们怎么能保证同一个归档编号不会多次生成?如果没有任何东西会使其返回不同的值,那么我将是最高兴的。但是,我仍然觉得它可以为多个并发呼叫返回不同的值另外,我认为您提供的链接会锁定整个SQL server。我在想可能是tablock x之类的东西?您没有更新
文档。在函数中填充number
(您可能在外部执行此操作)。我不是SQL Server专家,但我希望至少看到此列的
更新
,一个包含
选择
更新
的事务,以及设置为
可序列化
的事务隔离级别。应用程序锁不会锁定整个服务器,但锁的作用域将是整个服务器。这表示在释放锁之前,获取同一锁的任何尝试都将失败。使用文档中的
(UPDLOCK,HOLDLOCK)