SQL SERVER 2008 R2事务快照隔离级别未按预期工作



我创建了一个名为" test_isolation "的数据库,并创建了一个包含数据的表" person "

name    age
----    ---
test1    1
test2    2
test3    3
test4    4
test5    5
test6    6

现在将数据库更改为允许在session1

中进行快照隔离
ALTER DATABASE test_isolation
SET ALLOW_SNAPSHOT_ISOLATION ON
GO 

现在我在会话2

创建一个事务
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
BEGIN TRAN
SELECT * FROM PERSON
GO
DELETE FROM PERSON WHERE name = 'test6'
GO
SELECT * FROM PERSON
GO

结果与预期一致。(注意,我们还没有提交这个事务!)

现在我在会话3 中执行以下查询
SELECT * FROM PERSON

会话3中的查询一直在无限运行,这意味着表被锁定。

如果我回到会话2并提交事务…我能够在会话3上运行查询,结果与预期一致。

事务隔离级别SNAPSHOT不应该锁定表对吗?是我做错了什么,还是我对事务SNAPSHOT隔离的理解是错误的?

请帮. .

必须在会话3中显式声明SET TRANSACTION ISOLATION LEVEL SNAPSHOT,否则会话3仍然会以READ_COMMITTED状态运行,并且阻塞更新。

这个选项也可以在数据库级别设置,将READ_COMMITTED替换为SNAPSHOT。

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

最新更新