gpt4 book ai didi

sql-server - SQL 服务器 : VIEW with NO LOCK but called without NO LOCK

转载 作者:行者123 更新时间:2023-12-05 09:06:31 25 4
gpt4 key购买 nike

我在 Microsoft SQL Server 2016 上,我有以下引用 View 的(简化的)查询:

SELECT Column1
FROM dbo.myView

View 如下所示:

CREATE VIEW dbo.myView
AS
SELECT Column1
FROM dbo.SomeOtherTable WITH (NOLOCK)

我现在的问题是:外层 SELECT 使用 NOLOCK 表提示的事实是否意味着 VIEW 内的 NOLOCK 无关紧要?或者在执行外部 SELECT 时 NOLOCK 是否仍然相关?

我的问题的更大背景是我有一个案例,我正在分析服务器上的阻塞情况。我找到了一个查询,例如上面描述的 SELECT:A SELECT query was using a VIEW。 VIEW 使用了 NOLOCK 表提示,但外部 SELECT 没有。尽管如此,该查询仍然是一个障碍,我正在尝试找出造成这种情况的原因。

我已经做了一些研究,我能找到的唯一确认是人们想知道 NOLOCK 是否向下传播到内部表的问题。

最佳答案

这很容易测试。首先,在沙盒环境中,运行以下命令:

CREATE TABLE dbo.MyTable (ID int);
GO


CREATE VIEW dbo.MyView AS

SELECT ID
FROM dbo.MyTable WITH (NOLOCK);
GO

CREATE VIEW dbo.MyView2 AS

SELECT ID
FROM dbo.MyTable;
GO

BEGIN TRANSACTION Test;

INSERT INTO dbo.MyTable
VALUES(1);

请注意,我没有COMMIT 事务。现在在新窗口中运行 SELECT * FROM dbo.MyView;。注意它返回结果。如果您还尝试 SELECT * FROM dbo.MyView2 WITH (NOLOCK); 您也会得到结果。但是,尝试 SELECT * FROM dbo.MyView2;,查询将“挂起”。

然后您可以通过返回到原始查询窗口并运行以下命令来“清理”:

COMMIT;
GO

DROP VIEW dbo.MyView2;
DROP VIEW dbo.MyView;
DROP TABLE dbo.MyTable;

当然,真正的问题是,您需要 NOLOCK,但这不是这个问题的目的。 p>

关于sql-server - SQL 服务器 : VIEW with NO LOCK but called without NO LOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65923426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com