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?
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.
essayez ceci:
ALTER DATABASE generic SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
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
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 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
je n'ai pas pris une seconde pour moi quand j'ai changé ma DB utilisateur unique
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 '
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.