当前位置:  开发笔记 > 编程语言 > 正文

SET READ_COMMITTED_SNAPSHOT ON需要多长时间?

如何解决《SETREAD_COMMITTED_SNAPSHOTON需要多长时间?》经验,为你挑选了5个好方法。

运行需要多长时间

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

我跑了它,花了10分钟.

如何检查是否已应用?



1> Rick..:

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

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


如果有其他打开的连接,我建议使用NO_WAIT选项立即失败.例如'ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH NO_WAIT'
尝试针对该数据库打开另一个查询窗口.如果可以,那么我希望你的声明还没有开始运行.
对.大多数数据库应该只需要几秒钟.如果需要更长的时间,它会在另一个(甚至是非活动的)连接之后等待终止,然后才能进行更改.因此,您可能需要找到并杀死当前连接的任何spid(在评估他们正在做什么之后).然后它应该很快.

2> 小智..:

试试这个:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE


不,"WITH ROLLBACK IMMEDIATE"意味着它会在启动ALTER DATABASE语句之前立即回滚任何打开的事务.除非你已经检查了哪些交易是开放的以及它们是否可以安全回滚,否则我建议不要这样做.
那么"WITH ROLLBACK IMMEDIATE"的用途是什么?这是否意味着它会在查询失败时自动回滚?

3> Simon_Weaver..:

好的(我是原始的提问者)所以事实证明,我甚至没有启用这个问题.

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

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对应于IsolationLevel.ReadCommitted在.NET
上面的选项ALLOW_SNAPSHOT_ISOLATION对应于IsolationLevel.Snapshot在.NET

关于不同版本控制的好文章


.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这样简单的事情就会导致这种情况.我有一个缓存,在初始化时"旋转"自己的datacontext,并且尝试将事务升级为完整的分布式事务.

解决方案很简单:

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

另见Deadlocked@CodingHorror的文章


我想提一下,因为我不确定:你**可以独立于'ALLOW_SNAPSHOT_ISOLATION`打开`READ_COMMITTED_SNAPSHOT`.您可以将'ALLOW_SNAPSHOT_ISOLATION`**关闭**并仍然可以从`READ_COMMITTED_SNAPSHOT`****获益.测试:Microsoft SQL Server 2012 - 11.0.2100.60
此选项更改READ COMMITTED的实现方式.关闭该选项后,SQL Server将使用锁来控制访问.这就是为什么你的.NET代码没有生成警告的原因 - 你仍然得到了行为,只是以不同的(并且更可能是死锁)方式完成.

4> Nick Berardi..:

试试这段代码:

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



5> Jeff Mergler..:

我尝试了命令:

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 '

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有