TSQL NOLOCK VIEW 和存储过程

Posted

技术标签:

【中文标题】TSQL NOLOCK VIEW 和存储过程【英文标题】:TSQL NOLOCK VIEW and stored procedure 【发布时间】:2010-07-30 14:02:23 【问题描述】:

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

我们最近开始对我们的很多观点实施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 起作用了?

【问题讨论】:

如果您想始终使用它,请在开始时使用SET TRANSACTION READ UNCOMMITTED。贵公司知道使用NOLOCK 的风险吗?即你可能会得到不正确的数字 【参考方案1】:

请参阅the answers 这个 SO 问题。引用:

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

【讨论】:

很抱歉在这篇文章中重复这个问题。反过来呢:如果 store proc 上有一个 NOLOCK 并且视图没有 NOLOCK? @Mike - 存储过程没有定义 NOLOCK。他们可以在他们调用的表/视图上定义 NOLOCK。【参考方案2】:

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

【讨论】:

反过来呢?如果 NOLOCK 在 store proc 上并且视图没有 NOLOCK? 如果您在存储过程中使用 NOLOCK 从视图中选择,它将使用 NOLOCK 进行特定调用...但它不会神奇地使视图始终使用 NOLOCK。

以上是关于TSQL NOLOCK VIEW 和存储过程的主要内容,如果未能解决你的问题,请参考以下文章

数据库工程开发秘籍之TSQL 存储过程user stored procedure的概念与案例实战

表连接Tsql基本编程和存储过程

tsql 执行存储过程

TSQL 何时为存储过程中的变量(和表变量)分配内存

TSQL编写存储过程计算1!+2!+3!+…+N!

2017-3-16 Tsql基础编程 存储过程 触发器 级联删除