Pergunta

Quanto tempo deve demorar para executar

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

Eu corri isso e é tomado 10 minutos.

Como posso verificar se ela é aplicada?

Foi útil?

Solução

Você pode verificar o status do ajuste READ_COMMITTED_SNAPSHOT usando o sys.databases vista. Verifique o valor da coluna is_read_committed_snapshot_on. Já feitas e respondidas .

Quanto à duração, Books Online afirma que não pode haver quaisquer outras conexões com o banco de dados quando isso acontece, mas não requer modo de usuário único. Então você pode estar bloqueado por outras conexões ativas. Run sp_who (ou sp_who2 ) para ver o que mais está conectado ao banco de dados.

Outras dicas

Tente isto:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

OK (Eu sou o interlocutor original) para que ele despeja todo este tempo eu nem sequer têm o danado habilitado.

Aqui está o final código para executar para habilitar o modo instantâneo e verifique se ele está habilitado.

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'

Isso funciona mesmo com conexões ativas (presumivelmente você está bem com eles sendo expulso).

Você pode ver o antes e depois do estado e este deve ser executado quase que imediatamente.


IMPORTANTE:

O READ_COMMITTED_SNAPSHOT opção acima corresponde a IsolationLevel.ReadCommitted em .NET
O ALLOW_SNAPSHOT_ISOLATION opção acima corresponde a IsolationLevel.Snapshot em .NET

Excelente artigo sobre controle de versão diferente


.NET Sugestões:

Looks como Isolationlevel.ReadCommitted é permitido no código mesmo se não for habilitado pelo banco de dados. Nenhum aviso é lançada. Então faça um favor e ter certeza que é ligado antes de assumir que é por 3 anos como eu fiz !!!

Se você estiver usando C # você provavelmente quer o ReadCommitted IsolationLevel e não Snapshot - a menos que você está fazendo as gravações nesta transação

.

READ COMMITTED SNAPSHOT faz otimista leituras e gravações pessimistas. Em contraste, SNAPSHOT faz otimista leituras e gravações otimistas. (daqui)

bool snapshotEnabled = true;

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

     }
}

Em adicional que você pode receber um erro sobre ser 'incapaz de promover' uma transação. Procurar 'promoção' no System.Transactions introduzindo no .NET Framework 2.0 .

A menos que você está fazendo algo especial, como se conectar a um banco de dados externo (ou segundo banco de dados), então algo tão simples como a criação de um novo DataContext pode causar isso. Eu tinha um cache que 'virou-se' a sua própria datacontext na inicialização e este estava tentando escalar a transação para uma completa distribuída.

A solução era simples:

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

Veja também Deadlocked artigo de @CodingHorror

Tente este código:

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

Eu tentei o comando:

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO

contra uma caixa de dev, mas o que levou 10+ minutos e assim eu matei ele.

Então eu encontrei isto:

https://willwarren.com/2015/10 / 12 / sql-server leitura comprometida-snapshot /

e usou seu bloco de código (que levou cerca de 1:26 para executar):

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 '

Tente banco de dados mestre uso antes de alterar banco de dados atual.

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO

Eu não tomar um segundo para mim quando eu mudei meu DB para único usuário

Tente desligar a outros serviços SQL de modo que apenas o serviço do servidor SQL está em execução.

Mina correu por 5 minutos, em seguida, I cancelada porque era óbvio que nada estava acontecendo. O servidor novo uma marca para que não haja outros usuários conectados. Eu desligar o SQL Reporting Services e, em seguida, correu-lo novamente .. levou menos de um segundo para ser concluído.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top