91 votes

Combien de temps SET READ_COMMITTED_SNAPSHOT ON doit-il durer?

Combien de temps faut-il pour courir

 ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON
 

Je viens de le lancer et ça a pris 10 minutes.

Comment puis-je vérifier s'il est appliqué?

76voto

Rick Points 1582

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

Comme pour la durée, des Livres en Ligne il ya des états qui ne peuvent pas être toutes les autres connexions à la base de données lorsque cela a lieu, mais il n'exige pas la mode mono-utilisateur. Donc, vous pouvez être bloqué par d'autres connexions actives. Exécutez sp_who (ou sp_who2) pour voir à quoi d'autre est connecté à la base de données.

35voto

Simon_Weaver Points 31141

OK (je suis l'original de l'interlocuteur) il s'avère donc tout ce temps je n'ai même pas de la chose sacrée activé.

Voici l' ultime code à exécuter pour activer le mode snapshot 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 connexions actives (sans doute que vous êtes bien avec eux, recevoir des coups de pied).

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


IMPORTANT:

L'option READ_COMMITTED_SNAPSHOT ci-dessus correspond à IsolationLevel.ReadCommitted .NET
L'option ALLOW_SNAPSHOT_ISOLATION ci-dessus correspond à IsolationLevel.Instantané dans le .NET

Excellent article sur la gestion des versions différentes


.NET Conseils:

Ressemble Isolationlevel.ReadCommitted est autorisé dans le code même si non activé par la base de données. Aucun avertissement n'est jeté. Donc, ne vous une faveur et assurez-vous qu'il est activé avant que vous suppose que c'est pour 3 ans comme je l'ai fait!!!

Si vous êtes à l'aide de C#, vous voudrez probablement l' ReadCommitted IsolationLevel et pas Snapshot - sauf si vous faites de l'écrit dans cette transaction.

READ COMMITTED SNAPSHOT ne optimiste lit et pessimiste écrit. En revanche, SNAPSHOT ne optimiste lit et optimiste écrit. (à partir d'ici)

bool snapshotEnabled = true;

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

     }
}

Dans supplémentaires, vous pouvez obtenir une erreur "impossible de promouvoir" une transaction. Recherche pour "promotion" dans l'Introduction du Système.Les Transactions dans le .NET Framework 2.0.

Sauf si vous faites quelque chose de spécial, comme une connexion à une base de données externe (ou deuxième base de données), puis une chose aussi simple que la création d'un nouveau DataContext peuvent être en cause. J'ai eu une cache que " filé son propre datacontext à l'initialisation et l'on essaie d'escalader la transaction distribuée complète.

La solution est simple :

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

Voir aussi Deadlocked article par @CodingHorror

9voto

Nick Berardi Points 31361

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
 

3voto

eLVik Points 171

Essayez d'utiliser la base de données master avant de modifier la base de données actuelle.

 USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X