SQL Server数据库锁-无锁选择

问题描述 投票:0回答:1

[我们有几个视图可以称为其他视图。如果父视图从带有NOLOCK的子视图中选择,但是子视图为missing NOLOCKs,这会导致锁定吗?

IE:

VIEW1:

    select * from view2 WITH (NOLOCK)

VIEW2:

    select * from hugetable

从view1中进行选择是否会有效地忽略NOLOCK,因为view2的定义中缺少它?

sql-server sql-server-2016 locks
1个回答
0
投票

The documentation states

所有锁定提示都传播到所有的表和视图由查询计划访问,包括查看。

这很容易测试。

设置

CREATE DATABASE Testing

GO

ALTER DATABASE Testing SET READ_COMMITTED_SNAPSHOT  OFF

GO

USE Testing 

GO

CREATE TABLE dbo.Demo(X int);

INSERT INTO dbo.Demo VALUES (1), (2), (3);

go

CREATE VIEW dbo.[Inner] AS 
SELECT *
FROM dbo.Demo

GO

CREATE VIEW dbo.[Outer] AS 
SELECT *
FROM dbo.Demo
WITH (NOLOCK)

连接1(使事务打开并获得一个锁和未提交的行)

BEGIN TRAN

INSERT INTO dbo.Demo VALUES (4);

连接2

SELECT *
FROM dbo.[Outer] 

返回

X
-----------
1
2
3
4

显示NOLOCK提示被向下传播,并且它从未提交的事务中读取值4。 (按预期阻止从dbo.[Inner]中进行选择)

© www.soinside.com 2019 - 2024. All rights reserved.