启用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 自动提交事务提供相同的行为。
根据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 自动提交事务提供相同的行为。