首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用ALLOW_SNAPSHOT_ISOLATION时是否需要READ_COMMITTED_SNAPSHOT?

启用ALLOW_SNAPSHOT_ISOLATION时是否需要READ_COMMITTED_SNAPSHOT?
EN

Stack Overflow用户
提问于 2022-05-25 21:53:29
回答 2查看 565关注 0票数 -1

在按照ALLOW_SNAPSHOT_ISOLATION启用READ_COMMITTED_SNAPSHOT之前,是否真的有必要启用Server中的快照隔离级别

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

我真的不明白是否需要ALLOW_SNAPSHOT_ISOLATION,或者在启用READ_COMMITTED_SNAPSHOT之前没有设置它的后果

我在我们的生产数据库中遇到了一个死锁,它驻留在VM中。

事务(进程ID XX)与另一个进程在锁定资源上陷入僵局,并已被选择为死锁牺牲品。重新运行事务。

这些事务中的一个是SELECT (持有S锁),另一个是INSERT (持有IX锁)。

在尝试对包含生产数据备份的SQL数据库进行复制后,直到我意识到隔离级别存在差异(通过DBCC USEROPTIONS获得),我才能将其复制。

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

托管的VM (SQLServer 15.0.2080.9):读取已提交

在通过运行ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT OFF来匹配Azure中的隔离级别之后,我能够重现这个问题。

现在,我希望将read提交快照设置为生产数据库中的隔离级别。上面提到的链接说明我需要运行以下两个命令:

代码语言:javascript
复制
ALTER DATABASE MyDatabase  
SET ALLOW_SNAPSHOT_ISOLATION ON  
  
ALTER DATABASE MyDatabase  
SET READ_COMMITTED_SNAPSHOT ON  

但是,在Azure中似乎不允许快照隔离(SELECT snapshot_isolation_state_desc FROM sys.databases WHERE NAME = 'MyDatabase'返回)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-25 22:04:33

在Server中按照快照隔离级别启用ALLOW_SNAPSHOT_ISOLATION之前,是否真的需要启用READ_COMMITTED_SNAPSHOT? Azure创建的实例似乎没有启用它,尽管它们的隔离级别设置为READ_COMMITTED_SNAPSHOT。

不需要启用ALLOW_SNAPSHOT_ISOLATION就可以启用READ_COMMITTED_SNAPSHOT,而visa则相反。只有在显式使用ALLOW_SNAPSHOT_ISOLATION隔离(SET TRANSACTION ISOLATION LEVEL SNAPSHOT)时才需要READ_COMMITTED_SNAPSHOT,而READ_COMMITTED_SNAPSHOT则更改READ_COMMITTED隔离级别(默认级别)的行为以使用行版本控制,而不是锁定语句级别的读取一致性。

尽管这两种方法都使用行版本控制,但一个重要的区别是,READ_COMMITTED_SNAPSHOT在语句开始时返回数据快照,而SNAPSHOT隔离级别在事务开始时返回数据快照,这是包含多个查询的事务的一个重要考虑事项。这两者将为单语句自动提交事务提供相同的行为。

票数 3
EN

Stack Overflow用户

发布于 2022-09-19 17:42:18

不,启用READ_COMMITTED_SNAPSHOT 隔离级别时不需要。

启用READ_COMMITTED_SNAPSHOT 隔离级别时,您需要设置READ_COMMITTED 隔离级别,并使用打开READ_COMMITTED_SNAPSHOT -- MSSQL命令位于下面。

代码语言:javascript
复制
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
ALTER DATABASE <database_name> SET READ_COMMITTED_SNAPSHOT ON
GO 

此外,在启用SNAPSHOT 隔离级别时,您需要设置SNAPSHOT 隔离级别,并使用打开在下面的MSSQL命令。

代码语言:javascript
复制
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
ALTER DATABASE <database_name> SET ALLOW_SNAPSHOT_ISOLATION ON
GO 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72384548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档