SET READ_COMMITTED_SNAPSHOT ON需要多长时间?

运行需要多长时间

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON 

我刚跑了10分钟。

我如何检查它是否被应用?

您可以使用sys.databases视图来检查READ_COMMITTED_SNAPSHOT设置的状态。 检查is_read_committed_snapshot_on列的值。 已经问及回答 。

至于持续时间,联机丛书指出,发生这种情况时,不能有任何其他数据库连接,但不需要单用户模式。 所以你可能被其他活动连接阻止。 运行sp_who (或sp_who2 )来查看还有哪些连接到该数据库。

尝试这个:

 ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE 

好的(我是最初的提问者),所以事实certificate,这整个时间我甚至都没有启用。

这是运行启用快照模式并确保启用的最终代码 。

 SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb' ALTER DATABASE shipperdb SET allow_snapshot_isolation ON ALTER DATABASE shipperdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE ALTER DATABASE shipperdb SET read_committed_snapshot ON ALTER DATABASE shipperdb SET MULTI_USER SELECT is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state FROM sys.databases WHERE name='shipperdb' 

即使连接处于活动状态,这也可以工作(假设你没有被踢出)。

你可以看到之前和之后的状态,这应该几乎立即运行。


重要:

上面的选项READ_COMMITTED_SNAPSHOT对应于.NET中的IsolationLevel.ReadCommitted
上面的选项ALLOW_SNAPSHOT_ISOLATION对应于.NET中的IsolationLevel.Snapshot

关于不同的版本的伟大的文章


.NET技巧:

看起来像Isolationlevel.ReadCommitted是允许在代码中,即使没有启用数据库。 没有警告被抛出。 所以,请你自己帮忙,确定它已经打开,然后再假设它已经3年了,就像我做的一样!

如果您使用的是C#,则可能需要ReadCommitted IsolationLevel而不是Snapshot – 除非您正在写入此事务。

READ COMMITTED SNAPSHOT乐观读取和悲观写入。 相比之下, SNAPSHOT乐观的读取和乐观的写道。 (从这里)

 bool snapshotEnabled = true; using (var t = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) { using (var shipDB = new ShipperDBDataContext()) { } } 

另外,您可能会遇到“无法推广”交易的错误。 在.NET Framework 2.0中介绍System.Transactions中search“提升”。

除非你像连接到外部数据库(或第二个数据库)那样做一些特殊的事情,否则就像创build一个新的DataContext一样简单可以导致这种情况。 我有一个caching,在初始化时“自动”创build自己的datacontext,并试图将事务升级到完整的分布式。

解决scheme很简单:

  using (var tran = new TransactionScope(TransactionScopeOption.Suppress)) { using (var shipDB = new ShipperDBDataContext()) { // initialize cache } } 

另请参阅@CodingHorror的Deadlocked文章

试试这个代码:

 if(charindex('Microsoft SQL Server 2005',@@version) > 0) begin declare @sql varchar(8000) select @sql = ' ALTER DATABASE ' + DB_NAME() + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE ; ALTER DATABASE ' + DB_NAME() + ' SET READ_COMMITTED_SNAPSHOT ON; ALTER DATABASE ' + DB_NAME() + ' SET MULTI_USER;' Exec(@sql) end 

尝试在更改当前数据库之前使用master数据库。

 USE Master GO ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON GO 

当我将我的数据库更改为单个用户时,我没有采取任何行动

尝试closures其他SQL服务,以便只有SQL服务器服务正在运行。

我跑了5分钟,然后我取消了,因为显然没有任何事情发生。 它是一个全新的服务器,所以没有其他用户连接。 我closures了SQL Reporting Services,然后再次运行它。花了不到一秒钟完成。

我试过这个命令:

 ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON GO 

对开发盒,但它花了10多分钟,所以我杀了它。

然后我发现这个:

https://willwarren.com/2015/10/12/sql-server-read-committed-snapshot/

并使用他的代码块(大概1:26运行):

 USE master GO /** * Cut off live connections * This will roll back any open transactions after 30 seconds and * restricts access to the DB to logins with sysadmin, dbcreator or * db_owner roles */ ALTER DATABASE MyDB SET RESTRICTED_USER WITH ROLLBACK AFTER 30 SECONDS GO -- Enable RCSI for MyDB ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON GO -- Allow connections to be established once again ALTER DATABASE MyDB SET MULTI_USER GO -- Check the status afterwards to make sure it worked SELECT is_read_committed_snapshot_on FROM sys.databases WHERE [name] = 'MyDB '