2010-07-30 87 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