如何解决SQL Server:没有锁的查看但没有锁的调用
我使用的是 Microsoft sql Server 2016,我有以下(简化的)查询引用视图:
SELECT Column1
FROM dbo.myView
视图如下所示:
CREATE VIEW dbo.myView
AS
SELECT Column1
FROM dbo.someOtherTable WITH (NOLOCK)
我现在的问题是: 外部 SELECT 不不使用 NOLOCK 表提示这一事实是否意味着 VIEW 中的 NOLOCK 无关紧要?还是在执行外部 SELECT 时 NOLOCK 仍然相关?
我的问题的更大背景是我有一个案例,我正在分析服务器上的阻塞情况。我发现了一个查询,例如上面描述的 SELECT:一个 SELECT 查询正在使用 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
,但这不是这个问题的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。