具有READUNCOMMITTED的SQL Server如何在VIEWS上运行?

时间:2010-08-05 14:39:28

标签: sql sql-server

我有一个包含多个表连接的视图。如果我在WITH (READUNCOMMITTED)上使用SELECT FROM View,这会传播并应用于视图加入的表吗?

3 个答案:

答案 0 :(得分:1)

隔离仅适用于它适用的表。

请考虑以下事项。在一个会话中,设置表并查看:

create table x (a int, b varchar(10))

create table y (c int, d varchar(10))

insert into x (a, b) values (1, 'Q')
insert into x (a, b) values (2, 'W')
insert into x (a, b) values (3, 'E')

insert into y (c, d) values (1, 'A')
insert into y (c, d) values (2, 'S')
insert into y (c, d) values (3, 'D')


create view v_test
as
select x.a, x.b, y.d
from x with (readuncommitted)
     inner join 
     y
     on x.a = y.c

从session1的视图中选择:

选择* 来自v_test

a       b       c
----    ----    ----
1       Q       A
2       W       S
3       E       D

现在打开另一个会话,然后启动一个事务,首先只更新x:

begin transaction

update x
set b = 'R'
where a = 1

返回会话1,然后执行视图。你现在可以得到这个:

a       b       d
----    ---     ---
1       R       A
2       W       S
3       E       D

请注意第一行中b的新值。

返回会话2,交易仍然打开,更新y:

update y
set d = 'F'
where c = 1

然后尝试在会话1中查询视图:

select *
from v_test

(你会发现它似乎需要相当长的时间。)

在查询仍在执行的情况下,返回会话2并提交事务:

(Session2现在看起来像这样:

begin transaction

update x
set b = 'R'
where a = 1

update y
set d = 'F'
where c = 1

commit

回顾session1,结果现在将显示为:

a       b       d
---     ---     ---
1       R       F
2       W       S
3       E       D

在第一行中使用d的新值。

因此,长篇故事,不会传播WITH(READUNCOMMITTED)。

答案 1 :(得分:0)

我认为这是相反的答案,在这里:"SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" and views

但他们可能是错的,我还没有完成你的步骤帕特里克,如果你是正确的那么你应该通知那个线程的人!

答案 2 :(得分:0)

如果您在两个表上运行带有readuncommitted的Patrick的示例,您将看到它即使在事务正在进行时也能正常工作。 您也可以在视图中运行不带with readuncommitted的示例,但是将with readuncommitted传递给视图中的select,如果传递给视图,它将向下传播到视图中的select。 离。

select *
from v_test with (readuncommitted)