启用快照隔离后阻塞继续

Aka*_*ash 3 sql-server isolation-level snapshot-isolation blocking

在 SQL Server 2012 实例上托管的数据库上,我已启用ALLOW_SNAPSHOT_ISOLATION并验证状态为ON使用

SELECT snapshot_isolation_state_desc,name from sys.databases

但是,在 2 个单独的会话中,如果我TABLOCK在第一个和UPDATE第二个中运行长时间运行的选择(反之亦然),无论哪个查询首先开始都会阻止第二个查询(根据sp_who2

看着

select * from sys.dm_exec_requests , 两个查询的事务隔离级别都是已提交读 (2)

根据我的理解,启用快照隔离后,tempdb 的使用率应该会增加,但在这种情况下不应发生阻塞。我是否缺少一些配置步骤来实现这种行为?

Dan*_*man 8

如果您的目的是避免读者在默认READ_COMMITTED隔离级别中阻止写入者和反之亦然,请打开READ_COMMITTED_SNAPSHOT数据库选项。这将导致使用行版本控制而不是锁定来实现语句级读取一致性。

尽管经常混淆,但该ALLOW_SNAPSHOT_ISOLATION选项与READ_COMMITTED_SNAPSHOT. ALLOW_SNAPSHOT_ISOLATION允许使用单独的SNAPSHOT隔离级别来提供多语句读取一致性,但需要更改代码才能使用它。该READ_COMMITTED_SNAPSHOT选项提供了语句级读取一致性,无需更改代码,但应该注意锁定行为对依赖锁定的应用程序的影响。


Jam*_*son 5

启用ALLOW_SNAPSHOT_ISOLATION不会改变代码的行为。相反,如果您愿意,它为您能够使用行版本控制奠定了基础。一旦对数据库应用了快照隔离,如果使用以下语句,查询就可以成功地使用行版本控制:

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Run Code Online (Sandbox Code Playgroud)

Kendra Little 的这篇文章很好地介绍了快照隔离级别