我创建了一个名为" 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隔离的理解是错误的?
请帮. .
必须在会话3中显式声明SET TRANSACTION ISOLATION LEVEL SNAPSHOT
,否则会话3仍然会以READ_COMMITTED状态运行,并且阻塞更新。
这个选项也可以在数据库级别设置,将READ_COMMITTED替换为SNAPSHOT。
ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON