SET READ_COMMITTED_SNAPSHOT ON需要多长时间?

时间:2008-10-24 02:51:46

标签: sql-server isolation-level read-committed-snapshot

运行

需要多长时间
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

我刚跑了它,花了10分钟。

如何检查是否已应用?

8 个答案:

答案 0 :(得分:63)

您可以使用 sys.databases 视图查看READ_COMMITTED_SNAPSHOT设置的状态。检查 is_read_committed_snapshot_on 列的值。已经asked and answered

对于持续时间,联机丛书声明在发生这种情况时不能与数据库建立任何其他连接,但它不需要单用户模式。因此,您可能会被其他活动连接阻止。运行 sp_who (或 sp_who2 ),查看该数据库还有哪些内容。

答案 1 :(得分:44)

试试这个:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

答案 2 :(得分:27)

好的(我是原始的提问者)所以事实证明,我甚至没有启用该功能。

这是运行ultimate code以启用快照模式并确保启用快照模式。

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

Great article about different versioning


.NET提示:

即使数据库未启用,代码中也允许Isolationlevel.ReadCommitted。没有警告。那么请你自己帮个忙,并确保它在你假设它像我做了3年之前一样开启!!!

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

READ COMMITTED SNAPSHOT执行乐观的阅读和悲观的写作。相反,SNAPSHOT执行乐观读取和乐观写入。 (from here)

bool snapshotEnabled = true;

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

     }
}

另外,您可能会收到有关“无法宣传”交易的错误消息。在Introducing System.Transactions in the .NET Framework 2.0中搜索“促销”。

除非您正在做一些特殊的事情,比如连接到外部数据库(或第二个数据库),否则像创建新的DataContext这样简单的事情就会导致这种情况。我有一个缓存,它在初始化时“旋转”了自己的datacontext,并试图将事务升级为完整的分布式事务。

解决方案很简单:

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

另见Deadlocked article by @CodingHorror

答案 3 :(得分:8)

试试这段代码:

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

答案 4 :(得分:4)

我尝试了命令:

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 '

答案 5 :(得分:3)

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

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO

答案 6 :(得分:2)

当我将数据库更改为单个用户

时,我没有花一点时间

答案 7 :(得分:0)

尝试关闭其他SQL服务,以便只运行SQL Server服务。

我跑了5分钟,然后我取消了它,因为很明显没有发生任何事情。它是一个全新的服务器,因此没有其他用户连接。我关闭了SQL Reporting Services,然后又重新运行..只需不到一秒钟即可完成。