在 SQL Server 2012 实例上托管的数据库上,我已启用ALLOW_SNAPSHOT_ISOLATION
并验证状态为ON
使用
SELECT snapshot_isolation_state_desc,name from sys.databases
TABLOCK
但是,在 2 个单独的会话中,如果我在第一个和UPDATE
第二个(反之亦然)中运行一个长时间运行的 select ,则无论哪个查询首先开始都会阻止第二个查询(根据sp_who2
)
看着
select * from sys.dm_exec_requests
,这两个查询的事务隔离级别均为已提交读 (2)
据我了解,启用快照隔离后,tempdb 的使用量应该会增加,但在这种情况下不应发生阻塞。我是否缺少一些配置步骤来实现此行为?
如果您的意图是避免读取器在默认隔离级别下阻塞写入器,反之亦然
READ_COMMITTED
,请打开READ_COMMITTED_SNAPSHOT
数据库选项。这将导致使用行版本控制而不是锁定来实现语句级读取一致性。尽管经常感到困惑,但该
ALLOW_SNAPSHOT_ISOLATION
选项与READ_COMMITTED_SNAPSHOT
.ALLOW_SNAPSHOT_ISOLATION
允许使用单独的SNAPSHOT
隔离级别来提供多语句读取一致性,但需要更改代码才能使用它。该READ_COMMITTED_SNAPSHOT
选项无需更改代码即可提供语句级别的读取一致性,但应该了解锁定行为对依赖锁定的应用程序的影响。启用
ALLOW_SNAPSHOT_ISOLATION
不会改变代码的行为。相反,它为您在需要时能够使用行版本控制奠定了基础。将快照隔离应用于数据库后,如果使用以下语句,则查询可以成功使用行版本控制:Kendra Little 的这篇文章很好地介绍了快照隔离级别。