sql server-设置READ_COMMITTED_SNAPSHOT ON需要多长时间



运行需要多长时间

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

我刚跑了10分钟。

如何检查它是否已应用?

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

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

试试这个:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

好吧(我是最初的提问者),所以一直以来我甚至没有启用该死的东西。

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

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'

即使在连接处于活动状态的情况下,这也能起作用(大概你对它们被踢出没问题)。

您可以看到before和after状态,这应该会立即运行。


重要:

上面的选项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中搜索"促销"。

除非你正在做一些特殊的事情,比如连接到一个外部数据库(或第二个数据库),否则像创建一个新的DataContext这样简单的事情可能会导致这种情况。我有一个缓存,它在初始化时"旋转"了自己的数据上下文,这是为了将事务升级为完全分布式事务。

解决方案很简单:

        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

我尝试了命令:

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO

对抗一个dev盒子,但它花了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 '

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

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

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

您所需要做的就是:ALTER DATABASE xyz设置READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMIMEDIATE;

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

带有"立即回滚";我的数据库是300GB,大约花了20-30秒。

ALTER DATABASE DBNAME SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

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

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

相关内容

  • 没有找到相关文章

最新更新