4

我创建了一个名为“test_isolation”的数据库并创建了一个包含数据的表“人”

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隔离的理解是错误的?

请帮忙..

4

1 回答 1

8

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

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

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON
于 2013-04-04T17:36:43.477 回答