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 和存储过程的主要内容,如果未能解决你的问题,请参考以下文章