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

4
我创建了一个名为'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 

现在我在第二个会话中创建了一个事务。
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

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

如果我回到第二个会话并提交事务...我就能在第三个会话上运行查询,并且结果符合预期。

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

请帮忙……

1个回答

8

你必须在会话三中明确声明 SET TRANSACTION ISOLATION LEVEL SNAPSHOT,否则会话三仍将作为 READ_COMMITTED 运行并阻塞更新。

此选项也可以在数据库级别设置,用 SNAPSHOT 替换 READ_COMMITTED。

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

3
在默认的READ COMMITTED隔离级别下,启用READ_COMMITTED_SNAPSHOT ON选项可以访问版本化行。如果READ_COMMITTED_SNAPSHOT选项被设置为OFF,则必须为每个会话显式地设置快照隔离级别以访问版本化行。 - Aaron Bertrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接