sql server soupçon NOLOCK et ROWLOCK
Je suis en train d'enquêter sur un problème gênant sur mon site. Nous sommes loin de donner les prix régulièrement sur le site, mais pour participer au concours, les gens ont de se connecter. Ainsi, le site devient beaucoup occupée à des moments. J'ai constaté que quand un grand nombre de personnes essayant de se connecter et s'inscrire, je reçois des tas d'erreur à propos des blocages sur les UpdateUser, CheckPassword et GetUser fonctions alors le serveur est trop occupé et d'autres demandes de départ du délai.
Quand je regarde dans les procédures stockées, j'ai trouvé il y a VERROU utilisé sur 'UpdateUser'. Sont ceux ROWLOCKs provoquant le blocage? ou sélectionner uniquement le résultat serait une impasse?
Je pensais à l'aide de NOLOCK pour ma situation, mais après un peu de recherche, apparemment, il n'est pas recommandé...
- Que font les commandes SQL émis par votre "UpdateUser, CheckPassword et GetUser fonctions de" ressembler?
Vous devez vous connecter pour publier un commentaire.
Comme barry déjà expliqué, ces deux indicateurs peuvent se compléter les uns les autres, mais ils sont généralement utilisés dans des contextes différents et à résoudre les différents conflits de ressources.
Le AVEC (NOLOCK) indique au serveur d'employer READ UNCOMMITTED niveau d'isolation de transaction, ce qui signifie que vous êtes exposé au risque de lire non validées ("sale") les lignes qui peuvent par la suite être annulée, et ainsi n'ont jamais existé. Il n'empêche classique des blocages sur le lit, mais au détriment d'obtenir des données non valides.
Si il ya une chance GetUser ou CheckPassword opérations peuvent accéder au profil de l'utilisateur mis à jour par UpdateUser opération, puis AVEC (NOLOCK) n'est pas recommandé d'utiliser.
Le AVEC (VERROU) indicateur de table peut être utilisé avec des SELECT, INSERT, UPDATE et DELETE, instruire le serveur de n'appliquer une Gamme de Verrou(s) sur les lignes modifiées ou ajoutées, et à éviter l'escalade de la serrure à la page ou au niveau de la table. Le reste de lignes ne sont pas verrouillées et peut être consulté par une autre requête.
Toutefois, si le défaut niveau d'isolation de transaction au niveau du Serveur SQL est en LECTURE COMMIS ou plus restrictives, et de l'INSTANTANÉ de LIT ne sont pas activées, puis une instruction INSERT, UPDATE ou DELETE transaction peut encore bloquer la requête SELECT, si la recherche de conditions de match ou de chevauchement.
utilisez l'indicateur lorsqu'un seul ou seulement quelques lignes seront affectées par la requête, pour garder de la serrure de verrouillage de lignes qui ne seront pas supprimés par la requête. Qui va laisser une requête de lecture sans rapport avec les lignes en même temps au lieu d'avoir à attendre pour que la suppression complète.
Si vous l'utilisez sur une requête qui permettra de supprimer beaucoup de lignes, il peut dégrader les performances de la base de données va essayer d'éviter l'escalade de verrous pour une plus grande portée, même si il aurait été plus efficace.
AVEC (NOLOCK) est utilisé avec les commandes SELECT lorsque le temps de la sensibilité sur la récupération des données jusqu'à la microseconde n'est pas eccential, ou de la sélection d'un enregistrement nouvellement ajouté est vers le bas correctement.
AVEC (VERROU) est utilisée pour mettre à JOUR les déclarations de garder le blocage de la ligne à la ligne de niveau de verrouillage et de ne pas adresser à plus d'une ligne ou même un verrou de table.
Vous devez toujours utiliser les deux en vous sélectionnez les déclarations et les instructions update, ainsi que vous avez besoin pour bien créer des index, cache repitive de données afin de ne pas à tir rapide de requête de la base de données pour les données qui change peu, et de regarder votre connexion logique pour déterminer s'il n'est pas inutile d'effectuer la journalisation de données, et de vérifier votre SQL journaux d'erreur pour les erreurs qui pourraient ralentir l'accès à votre site web.