1

在我们公司,我们倾向于使用视图和存储过程。

我们最近开始对NOLOCK我们的许多观点执行该声明。

我想知道:如果我申请NOLOCK一个视图,它会“涓涓细流”到存储过程

假设我有一个名为的视图viewPartyPackage,而视图语句是...

SELECT   
    PartyPackageID, Name, Created, LastModified, Deleted 
FROM        
    dbo.PartyPackage WITH (NOLOCK) 
WHERE     
    (Deleted = 0)

而且我还有一个存储过程:

ALTER proc [dbo].[partypackage_Select]
    (@PartyPackageID bigint = null) 
AS 
    SELECT * 
    FROM [viewPartyPackage] PartyPackage 
    WHERE (@PartyPackageID IS NULL OR @PartyPackageID = [PartyPackageID])

我会因为我从存储过程中调用而失去 NOLOCK 功能,而我还需要在存储过程上放置一个 (NOLOCK) 吗?还是视图中的 NOLOCK 起作用了?

4

2 回答 2

2

请参阅此 SO 问题的答案。去引用:

请参阅MSDN 中的表提示 :“在 SQL Server 2005 中,所有锁定提示都传播到视图中引用的所有表和视图。此外,SQL Server 执行相应的锁定一致性检查。”

于 2010-07-30T14:06:11.967 回答
1

无论从哪里调用视图,视图中的 NOLOCK 都会生效。

于 2010-07-30T14:05:26.237 回答