Combien de time SET READ_COMMITTED_SNAPSHOT ON doit-il prendre?

Combien de time faut-il pour courir

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON 

Je l'ai juste couru et ça a pris 10 minutes.

Comment puis-je vérifier si elle est appliquée?

Vous pouvez vérifier l'état du paramètre READ_COMMITTED_SNAPSHOT à l'aide de la vue sys.databases . Vérifiez la valeur de la colonne is_read_committed_snapshot_on . Déjà demandé et répondu .

En ce qui concerne la durée, la documentation en ligne indique qu'il ne peut pas y avoir d'autres connections à la database lorsque cela se produit, mais qu'elle ne nécessite pas de mode mono-user. Vous risquez donc d'être bloqué par d'autres connections actives. Exécutez sp_who (ou sp_who2 ) pour voir ce qui est connecté à cette database.

Essaye ça:

 ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE 

OK (je suis le questionneur original) donc il s'avère que tout ce time je n'ai même pas eu la chose sacrément activée.

Voici le code ultime à exécuter pour activer le mode instantané et assurez-vous qu'il est activé.

 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' 

Cela fonctionne même avec des connections actives (probablement que vous êtes bien avec eux se faire expulser).

Vous pouvez voir l'état avant et après et cela devrait fonctionner presque immédiatement.


IMPORTANT:

L'option READ_COMMITTED_SNAPSHOT ci-dessus correspond à IsolationLevel.ReadCommitted dans .NET
L'option ALLOW_SNAPSHOT_ISOLATION ci-dessus correspond à IsolationLevel.Snapshot dans .NET

Super article sur différents versions


Conseils .NET:

On dirait que Isolationlevel.ReadCommitted est autorisé dans le code même s'il n'est pas activé par la database. Aucun avertissement n'est lancé. Alors faites-vous une faveur et assurez-vous qu'il est allumé avant de supposer que c'est pour 3 ans comme je l'ai fait !!!

Si vous utilisez C #, vous voulez probablement le ReadCommitted IsolationLevel et non le Snapshot – sauf si vous faites des écritures dans cette transaction.

READ COMMITTED SNAPSHOT fait des lectures optimistes et des écritures pessimistes. En revanche, SNAPSHOT fait des lectures optimistes et des écritures optimistes. (d'ici)

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

En outre, vous pouvez get une erreur sur le fait d'être «incapable de promouvoir» une transaction. Recherchez 'promotion' dans Introducing System.Transactions dans le .NET Framework 2.0 .

À less que vous ne fassiez quelque chose de spécial comme la connection à une database externe (ou à une deuxième database), quelque chose d'aussi simple que de créer un nouveau DataContext peut en être la cause. J'avais un cache qui "spun up" son propre datacontext à l'initialisation et cela essayait d'escalader la transaction à une dissortingbution complète.

La solution était simple:

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

Voir aussi Blocage de l'article par @CodingHorror

Essayez ce code:

 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 

Essayez d'utiliser la database master avant de modifier la database actuelle.

 USE Master GO ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON GO 

Je n'ai pas pris une seconde pour moi quand j'ai changé ma database en mono-user

Essayez d'arrêter les autres services SQL afin que seul le service SQL Server soit en cours d'exécution.

La mienne a duré 5 minutes puis je l'ai annulée parce qu'il était évident que rien ne se passait. C'est un tout nouveau server donc il n'y a pas d'autres users connectés. J'ai fermé les SQL Reporting Services et l'ai exécuté à nouveau .. a pris less d'une seconde pour terminer.

J'ai essayé la command:

 ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON GO 

contre une boîte de dev mais il a fallu 10 minutes et plus et je l'ai tué.

J'ai alors trouvé ceci:

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

et a utilisé son bloc de code (qui a pris environ 1:26 pour fonctionner):

 USE master GO /** * Cut off live connections * This will roll back any open transactions after 30 seconds and * ressortingcts 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 '