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

时间:2013-04-04 17:19:50

标签: sql-server sql-server-2008 tsql transaction-isolation

我创建了一个名为'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 隔离的理解是错误的?

请帮助..

1 个答案:

答案 0 :(得分:8)

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

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

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON