84

运行需要多长时间

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

我刚刚运行它,它需要 10 分钟。

如何检查它是否已应用?

4

9 回答 9

72

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

至于持续时间,Books Online 声明在发生这种情况时不能有任何其他连接到数据库,但它不需要单用户模式。因此,您可能会被其他活动连接阻止。运行sp_who(或sp_who2)以查看还有什么连接到该数据库。

于 2008-10-24T03:04:58.213 回答
56

试试这个:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
于 2009-08-10T06:50:53.503 回答
33

好的(我是最初的提问者)所以事实证明我什至没有启用该死的东西。

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

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#,您可能需要ReadCommittedIsolationLevel 而不是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 简介中搜索“promotion” 。

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

解决方案很简单:

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

另见Deadlocked@CodingHorror 的文章

于 2012-12-05T20:36:41.907 回答
9

试试这个代码:

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
于 2010-01-13T16:26:13.387 回答
9

我尝试了命令:

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 '
于 2017-08-09T19:45:04.807 回答
3

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

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
于 2012-05-10T12:43:23.390 回答
2

当我将数据库更改为单用户时,我没有花一秒钟时间

于 2012-11-12T11:41:21.797 回答
1

您需要做的就是:ALTER DATABASE xyz SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;

无需将数据库置于单用户模式。不过,您将回滚未提交的事务。

于 2021-09-08T13:44:12.117 回答
0

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

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

于 2017-03-28T18:59:00.433 回答