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

Csh*_*ser 4 t-sql sql-server transaction-isolation sql-server-2008

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

name    age
----    ---
test1    1
test2    2
test3    3
test4    4
test5    5
test6    6
Run Code Online (Sandbox Code Playgroud)

现在,数据库已更改为允许在session1中进行快照隔离

ALTER DATABASE test_isolation
SET ALLOW_SNAPSHOT_ISOLATION ON
GO 
Run Code Online (Sandbox Code Playgroud)

现在我在会话2中创建一个事务

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
BEGIN TRAN
SELECT * FROM PERSON
GO
DELETE FROM PERSON WHERE name = 'test6'
GO
SELECT * FROM PERSON
GO
Run Code Online (Sandbox Code Playgroud)

结果如预期.(注意我们还没有提交此交易!)

现在我在会话3中执行以下查询

SELECT * FROM PERSON
Run Code Online (Sandbox Code Playgroud)

会话3中的查询继续无限运行,这意味着表被锁定.

如果我回到会话2并提交事务..我能在会议3运行查询和结果符合预期.

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

请帮忙..

Tev*_*o D 8

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

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

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON
Run Code Online (Sandbox Code Playgroud)

  • 来自http://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.80).aspx的+1:`设置READ_COMMITTED_SNAPSHOT ON选项允许访问默认READ COMMITTED隔离级别下的版本化行.如果READ_COMMITTED_SNAPSHOT选项设置为OFF,则必须为每个会话显式设置Snapshot隔离级别,以便访问版本化的行. (3认同)