Pregunta

¿Cuánto tiempo debería llevar correr?

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

Lo acabo de ejecutar y se ha tardado 10 minutos.

¿Cómo puedo verificar si se aplica?

¿Fue útil?

Solución

Puede verificar el estado de la configuración READ_COMMITTED_SNAPSHOT usando la vista sys.databases . Compruebe el valor de la columna is_read_committed_snapshot_on . Ya se preguntado y respondido .

En cuanto a la duración, los Libros en línea indican que no puede haber otras conexiones a la base de datos cuando esto ocurre, pero no requiere el modo de usuario único. Por lo que puede ser bloqueado por otras conexiones activas. Ejecute sp_who (o sp_who2 ) para ver qué más está conectado a esa base de datos.

Otros consejos

Prueba esto:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE

Está bien (soy el interrogador original), así que resulta que todo este tiempo ni siquiera tuve la maldita cosa habilitada.

Aquí está el código final para ejecutar para habilitar el modo de instantánea y asegúrese de que 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'

Esto funciona incluso con las conexiones activas (presumiblemente no estás de acuerdo con que las echen).

Puede ver el estado antes y después, y esto debería ejecutarse casi de inmediato.


IMPORTANTE:

La opción READ_COMMITTED_SNAPSHOT anterior corresponde a IsolationLevel.ReadCommitted en .NET
La opción ALLOW_SNAPSHOT_ISOLATION anterior corresponde a IsolationLevel.Snapshot en .NET

Gran artículo sobre diferentes versiones


.NET Tips:

Parece que Isolationlevel.ReadCommitted está permitido en el código, incluso si no está habilitado por la base de datos. No se lanza ninguna advertencia. ¡Así que hazte un favor y asegúrate de que esté encendido antes de que asumas que lo es por 3 años como lo hice yo!

Si está usando C #, probablemente desee el ReadCommitted IsolationLevel y no Snapshot , a menos que esté haciendo escrituras en esta transacción.

READ COMMITTED SNAPSHOT hace lecturas optimistas y escrituras pesimistas. En contraste, SNAPSHOT hace lecturas optimistas y escrituras optimistas. (desde aquí)

bool snapshotEnabled = true;

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

     }
}

Además, puede recibir un error por no poder promocionar una transacción. Busque 'promoción' en Introducción de System.Transactions en .NET Framework 2.0 .

A menos que esté haciendo algo especial, como conectarse a una base de datos externa (o segunda base de datos), entonces algo tan simple como crear un nuevo DataContext puede causar esto. Tuve un caché que "amplió" su propio contexto de datos en la inicialización y esto estaba tratando de escalar la transacción a una completa distribuida.

La solución fue simple:

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

Vea también el artículo Deadlocked por @CodingHorror

Prueba 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

Probé el comando:

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO

contra un cuadro de desarrollo, pero me tomó más de 10 minutos y lo maté.

Entonces encontré esto:

https://willwarren.com/2015/10 / 12 / sql-server-read-commit-snapshot /

y usó su bloque de código (que tardó aproximadamente 1:26 en ejecutarse):

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 '

Intente usar la base de datos maestra antes de modificar la base de datos actual.

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO

No me tomé un segundo cuando cambié mi base de datos a usuario único

Intente apagar los otros servicios SQL para que solo se ejecute el servicio del servidor SQL.

El mío corrió durante 5 minutos y luego lo cancelé porque era obvio que no pasaba nada. Es un servidor completamente nuevo, por lo que no hay otros usuarios conectados. Apagué SQL Reporting Services y luego lo ejecuté de nuevo ... tardé menos de un segundo en completarse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top