我有一个包含多个表连接的视图。如果我在WITH (READUNCOMMITTED)
上使用SELECT FROM View
,这会传播并应用于视图加入的表吗?
答案 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)