我正在做一些测试以尝试了解快照隔离的工作原理……但我没有。我在我的数据库中(对atmSET ALLOW_SNAPSHOT_ISOLATION ON
不感兴趣)。READ_COMMITTED_SNAPSHOT
然后我做以下测试。我将通过 [s1] 和 [s2] 标记标记不同的会话(在我的 ssms 中实际上是不同的选项卡),[s2] 是隔离会话,而 [s1] 模拟另一个非隔离会话。
首先,做一张桌子,让我们给它一行。@[s1]:
create table _g1 (v int)
insert _g1 select 1
select * from _g1
(Output: 1)
现在让我们开始一个孤立的事务。@[s2]:
set transaction isolation level snapshot
begin tran
插入另一行,@[s1]:
insert _g1 select 2
现在让我们看看隔离事务“看到”了什么,@[s2]:
select * from _g1
(Output: 1,2)
奇怪的。隔离不应该从“Begin tran”那一刻起“开始计数”吗?在这里,它不应该返回 2....让我们再做一次。@[s1]:
insert _g1 select 3
@[s2]:
select * from _g1
(Output: 1,2)
所以,这一次它按我的预期工作,并没有考虑最新的插入。
如何解释这种行为?隔离是否在第一次访问每个表后开始工作?