启用READ_COMMITTED_SNAPSHOT时是否需要ALLOW_SNAPSHOT_ISOLATION?

Is ALLOW_SNAPSHOT_ISOLATION required when enabling READ_COMMITTED_SNAPSHOT?

根据snapshot isolation level in SQL Server启用READ_COMMITTED_SNAPSHOT之前真的有必要启用ALLOW_SNAPSHOT_ISOLATION吗?

Azure SQL 创建的实例似乎没有启用它,尽管它们的隔离级别设置为 READ_COMMITTED_SNAPSHOT

我真的不明白是否需要 ALLOW_SNAPSHOT_ISOLATION 或者在启用 READ_COMMITTED_SNAPSHOT

之前没有设置它的后果

我运行在我们托管在 VM 中的生产数据库中陷入僵局。

Transaction (Process ID XX) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

其中一个交易是 SELECT(持有 S 锁)而另一个是 INSERT(持有 IX锁定)。

在尝试针对包含我们生产数据备份的 SQL Azure 数据库进行复制后,我无法做到,直到我意识到隔离级别存在差异(通过 DBCC USEROPTIONS 获得) )

Azure (SQLServer 12.0.2000.8): 读取已提交的快照

VM 托管(SQL服务器 15.0.2080.9): 读取已提交

通过 运行ning ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT OFF 匹配 Azure DB 中的隔离级别后,我能够重现该问题。

现在我想将 read committed snapshot 设置为我们在生产数据库中的隔离级别。上面提到的 link 声明我需要 运行 这两个命令:

ALTER DATABASE MyDatabase  
SET ALLOW_SNAPSHOT_ISOLATION ON  
  
ALTER DATABASE MyDatabase  
SET READ_COMMITTED_SNAPSHOT ON  

但是,Azure DB 中似乎不允许快照隔离(SELECT snapshot_isolation_state_desc FROM sys.databases WHERE NAME = 'MyDatabase' returns OFF)

我也无法在 Azure SQL 实例的系统数据库中找到 tempdb

Is it really necessary to enable ALLOW_SNAPSHOT_ISOLATION before enabling READ_COMMITTED_SNAPSHOT as per snapshot isolation level in SQL Server?.

Azure SQL created instances do not seem to have it enabled, despite their isolation level set to READ_COMMITTED_SNAPSHOT.

无需启用 ALLOW_SNAPSHOT_ISOLATION 即可启用 READ_COMMITTED_SNAPSHOT 和 visa-versa。 ALLOW_SNAPSHOT_ISOLATION 仅当您显式使用 SNAPSHOT 隔离 (SET TRANSACTION ISOLATION LEVEL SNAPSHOT) 时才需要,而 READ_COMMITTED_SNAPSHOT 更改 READ_COMMITTED 隔离级别(默认级别)的行为以使用row-versioning 而不是锁定 statement-level 读取一致性。

虽然两者都使用 row-versioning,但一个重要的区别是 READ_COMMITTED_SNAPSHOT returns 语句开始时的数据快照,而 SNAPSHOT 隔离级别 returns 截至 事务 开始时的数据快照,这是包含多个查询的事务的重要考虑因素。两者都将为 single-statement 自动提交事务提供相同的行为。