我创建了一个名为'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 隔离的理解是错误的?
请帮助..
答案 0 :(得分:8)
您必须在会话3中明确声明SET TRANSACTION ISOLATION LEVEL SNAPSHOT
,否则会话3仍将作为READ_COMMITTED运行并阻止更新。
此选项也可以在数据库级别设置,以用SNAPSHOT替换READ_COMMITTED。
ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON