web-dev-qa-db-fra.com

Quels risques y a-t-il si nous activons un instantané de lecture validée dans sql-server?

J'ai lu ici que certaines données supplémentaires seront stockées par ligne afin que nous puissions voir une dégradation des performances, mais quels sont les autres risques?

par exemple. Cela affectera-t-il la récupération de la base de données? Y a-t-il autre chose que nous devons faire pour en profiter?

J'ai l'intention d'exécuter ces commandes:

ALTER DATABASE DatabaseName SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE DatabaseName SET ALLOW_SNAPSHOT_ISOLATION ON

Je crois que cela nous rapprochera d'Oracle où, si une transaction est en cours de mise à jour, d'autres transactions peuvent toujours lire les anciennes données. Est-ce correct?

J'étudie cela parce que j'en ai assez des problèmes de verrouillage dans SQL Server 2005. J'espère que cela pourrait réduire les blocages occasionnels que nos utilisateurs voient, aider les performances globales de notre application et encourager nos développeurs à faire plus d'une opération par transaction sans peur.

73
Adam Butler

Résumé

  1. Si vous avez des problèmes de verrouillage, vous avez un problème avec votre code: ce n'est pas le moteur de base de données
  2. Ce n'est pas une balle magique
  3. Vous pouvez ajouter plus de problèmes

Charger

Cela augmentera également la charge sur votre tempdb et CPU . Regarde aussi:

Sécurité

Le plus important, les isolements de clichés ne sont pas sûrs dans de nombreux cas par défaut. Lisez "Snapshot isolation" (Wikipedia) pour en savoir plus sur les anomalies d'écriture. La section suivante est "Rendre l'isolement des instantanés sérialisable" pour contourner ce problème.

En général, par conséquent, l'isolement de cliché pose une partie du problème du maintien de contraintes non triviales à l'utilisateur, qui peut ne pas apprécier les pièges potentiels ou les solutions possibles. L'avantage de ce transfert est une meilleure performance.

Regarde aussi:

49
gbn

Je sais que c'est un vieux fil, mais je dirais dans une large mesure l'isolement des instantanés is une balle magique. Il éliminera tous de votre blocage entre les lecteurs et les écrivains. Cela empêchera toutefois pas d'empêcher les écrivains de bloquer d'autres écrivains. Il n'y a pas de chemin aux alentours.

D'après mon expérience, la charge supplémentaire sur TEMPDB est négligeable et les avantages de la version en ligne pour réduire les lecteurs bloqués sont énormes.

Pour référence, le versionnage des lignes (isolation des instantanés) est la méthode utilisée par Oracle depuis des décennies pour réaliser l'isolement sans bloquer les lecteurs et les bases de données Oracle sur lesquelles j'ai travaillé pendant près de 20 ans d'expérience loin moins de problèmes de blocage que SQL Le serveur le fait. La plupart des développeurs SQL hésitent à utiliser l'isolement de cliché, car ils n'ont testé leur code que sur des bases de données qui utilisent le paramètre par défaut.

36
Chuck

Quelques points supplémentaires à ajouter aux autres réponses:

SET ALLOW_SNAPSHOT_ISOLATION ON active uniquement l'isolement de cliché dans une base de données. Pour en profiter, vous devez recoder et SET TRANSACTION ISOLATION LEVEL SNAPSHOT pour les transactions auxquelles vous souhaitez qu'il s'applique. Le code appelant devra être modifié pour gérer les erreurs de conflit de mise à jour.

Après SET READ_COMMITTED_SNAPSHOT ON, les instructions en lecture validée utilisent le versionnage en ligne. Remarque: il s'agit du niveau de l'instruction versionnage en ligne pour en lecture seule . Pour les mises à jour, la "vraie" ligne est récupérée et les verrous de mise à jour sont appliqués. Voir la section Résumé du comportement dans Comprendre les niveaux d'isolement basés sur le versionnement des lignes

Dans les deux cas, sans tests exhaustifs, vous risquez d'introduire un ensemble de problèmes complètement nouveau dans le système.

26
Mark Storey-Smith

Je crois que cela nous rapprochera d'Oracle où, si une transaction est en cours de mise à jour, d'autres transactions peuvent toujours lire les anciennes données. Est-ce correct?

Oui, ceci est correct .

Cela vaut la peine de lire les liens dans la réponse de gbn et je pense que la même chose s'applique au MVCC par défaut d'Oracle et à SQL Server en mode d'isolement de capture instantanée. J'ajouterais que si vous comprenez les pièges potentiels, l'OMI les avantages l'emportent de loin sur les difficultés supplémentaires (parlant d'un point de vue Oracle) - et bien sûr, certains problèmes de verrouillage disparaissent légitimement, c'est le but de MVCC (il existe également une classe de problèmes de verrouillage qui ne disparaîtront pas en raison de problèmes de code, mais je suppose que vous comprenez cela).

Nous utilisons SNAPSHOT ISOLATION dans tous nos projets qui utilisent SQL Server DB. Plus d'erreurs SQL 1205, qui ne sont pas causées par un code d'application incorrect, mais par le comportement de verrouillage de page et de verrouillage de ligne par défaut.

L'impact sur les performances est minime et jusqu'à présent 7 ans se sont écoulés, des centaines de millions d'opérations ont été traitées dans différents systèmes, sans aucun problème concernant l'ISOLEMENT D'INSTANTANÉ.

Les situations dans lesquelles plusieurs threads différents mettent à jour des informations critiques sur une seule ligne en parallèle sont extrêmement exceptionnelles et les chances que l'ISOLEMENT D'INSTALLATION soit la cause de tout problème d'incohérence sont très proches de zéro.

Si vous avez un système OLTP, qui, par conception, met à jour une seule ligne en fonction des données de la ligne actuelle dans de nombreux threads, bien entendu, les INSTANTANÉS ne sont pas acceptables dans de tels cas.

10