【发布时间】:2020-03-13 13:35:45
【问题描述】:
我正在做一些测试,试图了解快照隔离的工作原理……但我没有。我的数据库中有SET ALLOW_SNAPSHOT_ISOLATION ON(对READ_COMMITTED_SNAPSHOT atm 不感兴趣)。然后我做以下测试。我将通过 [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)
所以,这次它按我的预期工作,没有考虑最新的插入。
如何解释这种行为?每个表第一次访问后隔离是否开始工作?
【问题讨论】:
标签: sql sql-server tsql isolation-level snapshot-isolation