sql server - is_read_committed_snapshot_on - ¿Cuánto tiempo debería SET READ_COMMITTED_SNAPSHOT ON tomar?
alter database set read_committed_snapshot on (8)
Prueba esto:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
¿Cuánto tiempo debería llevar correr?
ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
Simplemente lo ejecuté y me tomó 10 minutos.
¿Cómo puedo verificar si se aplica?
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
Intente utilizar la base de datos master antes de alterar la base de datos actual.
USE Master
GO
ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
No tomé un segundo para mí cuando cambié mi base de datos a usuario único
Intente cerrar 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 estaba pasando nada. Es un nuevo servidor por lo que no hay otros usuarios conectados. Apagué SQL Reporting Services y luego lo ejecuté de nuevo. Tomó menos de un segundo completarlo.
OK (yo soy el autor de la pregunta original), así que todo este tiempo ni siquiera tuve la maldita cosa habilitada.
Aquí está el último código para ejecutar para habilitar el modo de instantánea y asegurarse 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 conexiones activas (presumiblemente estás bien con que las expulsen).
Puede ver el estado de 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 versiones diferentes
Consejos de .NET:
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 asumir que es por 3 años como lo hice !!!
Si está usando C #, probablemente desee ReadCommitted
IsolationLevel y no Snapshot
, a menos que esté escribiendo en esta transacción.
READ COMMITTED SNAPSHOT
realiza lecturas optimistas y escrituras pesimistas. Por el contrario, SNAPSHOT
hace lecturas optimistas y escrituras optimistas. (de aquí)
bool snapshotEnabled = true;
using (var t = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions
{
IsolationLevel = IsolationLevel.ReadCommitted
}))
{
using (var shipDB = new ShipperDBDataContext())
{
}
}
Además, puede obtener un error acerca de ser ''incapaz de promover'' una transacción. Busque ''promoción'' en Introducing 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 ''giró'' su propio contexto de datos en la inicialización y esto intentaba escalar la transacción a una distribuida completa.
La solución fue simple:
using (var tran = new TransactionScope(TransactionScopeOption.Suppress))
{
using (var shipDB = new ShipperDBDataContext())
{
// initialize cache
}
}
Ver también artículo en punto muerto por @CodingHorror
Puede verificar el estado de la configuración READ_COMMITTED_SNAPSHOT utilizando la vista sys.databases
. Compruebe el valor de la columna is_read_committed_snapshot_on
. Ya lo pregunté y respondí .
En cuanto a la duración, Books Online indica que no puede haber otras conexiones a la base de datos cuando esto ocurre, pero no requiere el modo de usuario único. Entonces 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.
Intenté el comando:
ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO
contra un cuadro de desarrollo, pero tardó más de 10 minutos, así que lo maté.
Entonces encontré esto:
https://willwarren.com/2015/10/12/sql-server-read-committed-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 ''