Combien de temps faut-il mettre lire le SNAPSHOT engagé sur take?

Combien de temps faut-il pour exécuter

ALTER DATABASE [MySite] SET READ_COMMITTED_SNAPSHOT ON

j'ai couru et ça a pris 10 minutes.

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

63
demandé sur Simon_Weaver 2008-10-24 06:51:46

8 réponses

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

quant à la durée, Books Online déclare qu'il ne peut pas y avoir d'autres connexions à la base de données lorsque cela se produit, mais cela ne nécessite pas le mode mono-utilisateur. Donc, vous pouvez être bloqué par d'autres actifs connexion. Cours! sp_who ( ou sp_who2 ) pour voir ce qui est connecté à cette base de données.

58
répondu Rick 2017-05-23 12:09:37

essayez ceci:

ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
38
répondu Hosam Aly 2009-08-10 07:02:38

OK (je suis l'auteur de la question) donc il s'avère que pendant tout ce temps, je n'ai même pas eu la fichue chose activée.

voici le ultimate code à exécuter pour activer le mode snapshot et s'assurer 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 (probablement vous êtes d'accord avec le fait qu'ils se font jeter).

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 au niveau D'isolement.ReadCommitted in .NET

L'option ALLOW_SNAPSHOT_ISOLATION ci-dessus correspond à IsolationLevel.Snapshot in. net

grand article sur les différentes versions


conseils de. Net:

ressemble à Isolationlevel.ReadCommitted est autorisé en code même si non activé par la base de données. Aucun avertissement n'est jeté. Alors faites-vous une faveur et assurez-vous qu'il est allumé avant de supposer qu'il est pour 3 ans comme je l'ai fait!!!

si vous utilisez C# vous voulez probablement le ReadCommitted IsolationLevel et non Snapshot - sauf si vous faites écrit dans cette transaction.

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

bool snapshotEnabled = true;

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

     }
}

supplémentaires, vous pouvez obtenir une erreur "impossible de promouvoir" une transaction. Rechercher 'promotion ' dans introduire le système.Transactions in the .NET Framework 2.0 .

sauf si vous faites quelque chose de spécial comme se connecter à une base de données externe (ou une deuxième base de données) alors quelque chose d'aussi simple que la création d'un nouveau DataContext peut causer cela. 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 était simple:

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

Voir aussi Deadlocked article de @CodingHorror

24
répondu Simon_Weaver 2017-05-23 11:46:56

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
8
répondu Nick Berardi 2010-01-13 16:26:13

essayez d'utiliser la base de données principale avant de modifier la base de données actuelle.

USE Master
GO

ALTER DATABASE [YourDatabase] SET READ_COMMITTED_SNAPSHOT ON
GO
2
répondu eLVik 2012-05-10 12:43:23

je n'ai pas pris une seconde pour moi quand j'ai changé ma DB utilisateur unique

2
répondu Yasin Kilicdere 2012-11-12 11:41:21

j'ai essayé la commande:

ALTER DATABASE MyDB SET READ_COMMITTED_SNAPSHOT ON
GO

contre un dev box mais ça a pris plus de 10 minutes et je l'ai tué.

j'ai alors trouvé ceci:

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

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

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 '
2
répondu Jeff Mergler 2017-08-09 19:45:04

essayer D'éteindre les autres services SQL de sorte que seul le service SQL server est en cours d'exécution.

Mine a couru pendant 5 minutes puis je l'ai annulé parce que c'était évident que rien ne se passait. Son un tout nouveau serveur donc il n'y a pas d'autres utilisateurs connectés. J'ai coupé les services de rapports SQL et je les ai relancés.. a pris moins d'une seconde pour terminer.

0
répondu Jeff 2017-03-28 18:59:00