2010-07-30 97 views
1

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

我们最近开始实施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起作用了吗?

+0

如果您想在整个过程中使用它,请在开始时使用'SET TRANSACTION READ UNCOMMITTED'。贵公司是否知道使用'NOLOCK'的风险?即你可能得到不正确的数字 – 2016-12-24 10:17:57

回答

2

查看the answers这个问题。引述:

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

+0

抱歉在这篇文章上重复提问。 另一方面呢: 如果在商店过程中NOLOCK和视图没有NOLOCK? – Mike 2010-07-30 14:10:54

+1

@Mike - 存储过程没有定义NOLOCK。他们可以在他们所调用的表格/视图上定义NOLOCK。 – Oded 2010-07-30 14:15:05

+0

感谢您的回答:D – Mike 2010-07-30 14:55:45

1

无论视图从何处被调用,视图中的NOLOCK都会生效。

+0

另一方面呢?如果NOLOCK在商店过程中并且视图没有NOLOCK? – Mike 2010-07-30 14:07:23

+0

如果您在存储过程中使用NOLOCK从视图中选择,它将针对该特定调用使用NOLOCK ...但它不会让视图始终使用NOLOCK。 – Fosco 2010-07-30 14:23:21