read_committed_snapshot read is_read_committed_snapshot_on committed sql-server isolation-level read-committed-snapshot

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 ''