[我们有几个视图可以称为其他视图。如果父视图从带有NOLOCK的子视图中选择,但是子视图为missing NOLOCKs,这会导致锁定吗?
IE:
VIEW1:
select * from view2 WITH (NOLOCK)
VIEW2:
select * from hugetable
从view1中进行选择是否会有效地忽略NOLOCK
,因为view2的定义中缺少它?
所有锁定提示都传播到所有的表和视图由查询计划访问,包括查看。
这很容易测试。
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)
BEGIN TRAN
INSERT INTO dbo.Demo VALUES (4);
SELECT *
FROM dbo.[Outer]
返回
X
-----------
1
2
3
4
显示NOLOCK
提示被向下传播,并且它从未提交的事务中读取值4
。 (按预期阻止从dbo.[Inner]
中进行选择)