8
votes

Utiliser Nolock Indicateur dans EF4?

Nous évaluons EF4 et mon DBA dit que nous devons utiliser la nolock indice dans toutes nos déclarations de sélection. Donc, je regarde comment faire cela se produire lorsque vous utilisez EF4.

J'ai lu les différentes idées sur la manière de faire cela se produire dans EF4, mais tous semblent être un travail autour et non sanctionné par Microsoft ou EF4. Quelle est la réponse «Microsoft officielle» à une personne qui souhaite que leur instruction SELECT inclure l'indice NOLOCK lors de l'utilisation de LINQ-TO-SQL / LINQ-TO-entités et EF4?

Au fait, les meilleures informations que j'ai trouvées étaient ici et j'encourage tout le monde intéressé par ce sujet pour lire ce fil.

Merci.


1 commentaires

Je suis d'accord avec le conseil dans le thread que vous liez: Utilisez instantané / lecture_commoded , pas nolock . Je considère nolock surtout obsolète - pas que c'était une bonne idée, car il rend vos transactions non-acide. Voir aussi Stackoverflow. com / questions / 1452996 / ... En outre, cet article résume les avantages et les inconvénients SQLMAG.com/articles/articleid/93075/93075.html?ad=1


6 Réponses :


-1
votes

Je sais que ce n'est pas une réponse à votre question, mais je voulais juste jeter ceci dans.

Il me semble que c'est (au moins partiellement partiellement) le travail de la DBA. C'est bien de dire qu'une application devrait se comporter d'une certaine manière, et vous pouvez et devrez certainement tenter de le programmer la façon dont il aimerait.

Le seul moyen d'être sûr, c'est que le DBA fonctionne sur l'application avec vous et construisez la surface de la DB qu'il souhaite présenter à l'application. S'il souhaite que des tables critiques soient interrogées comme une lecture non engagée, il devrait alors aider à fournir un ensemble de procédures stockées avec le niveau d'accès et d'isolement correct.

S'appuyant sur le code de l'application pour construire chaque requête ad-hoc correctement n'est pas une approche évolutive.


0 commentaires

30
votes

nolock = "lire non engagée" = lecture sale

Je supposerais que MM sait pourquoi ils ont choisi le niveau d'isolement par défaut comme "lu engagé"

Nolock, en fait, tout indice doit être utilisé très judicieusement: non par défaut.

Votre dba est un muppet. Voir ceci (tellement): Que peut-il arriver à la suite de l'utilisation de (nolock) sur chaque sélection de SQL Sever? . Si vous travaillez dans une banque, ou une institution où j'ai peut-être un compte s'il vous plaît laissez-moi savoir pour que je puisse le fermer.


6 commentaires

+1 J'étais sur le point de poster des méchants commentaires sur le DBA moi-même, mais je pense que "muppet" résume juste bien :)


Je pense que vous êtes un muppet si vous souhaitez effectuer chaque sélection de la base de données avec une serrure. Je suis à 100% pour les tables de verrouillage nécessitant une cohérence transactionnelle, mais si j'ai une table d'état ou une table utilisateur, toute table plus statique que dynamique, pourquoi je souhaite empêcher les autres de le lire pendant que je le lis? Et oui, une lecture / Sélectionnez une serrure sur la table si vous ne le saviez pas. Donc, même si la lecture est commise, c'est la valeur par défaut et je suis d'accord à 100% avec cela, il y a des occasions et des situations qui méritent pour un Nolock, et ils ne sont pas rares. Pas toutes les questions, mais certaines au moins


@Ryk: Cela fait-il une différence si vous ne bloquez pas d'autres lecteurs? Des tables véritablement statiques seraient mieux sur un groupe de fichiers en lecture seule. Pour les tables non statiques, vous pouvez lire des données pouvant être modifiées. Il ne faut qu'une lecture sale qui donne un résultat de requête incorrect qui pourrait avoir des conséquences massives. Mais bon, vous ne travaillez évidemment pas sur des systèmes où la précision est primordiale


@Ryk; Veuillez lire la question à nouveau. GBN suggère que le DBA est un muppet parce que "DBA dit que nous devons utiliser la nolock indique dans Tous Nos instructions de sélection" . Il (GBN) conseille également que tout indice (Nolock inclus) devrait être utilisé judicieusement. Pas jamais. Neuf à faire tous les éléments de sélection dans la base de données avec une serrure.


@Ryk n'hésitez pas à étudier les contributions de GBN afin que vous puissiez évaluer ce qu'il sait et ce qui n'est pas. (Lire: Pas besoin d'insulter.)


@GBN vient de lire après mes 5 premiers mots et vous verrez que je ne vous insultiserais pas, mais la déclaration MUPPET a évoqué des stéréotypes d'accepter que la valeur par défaut de "lire engagée" est la seule véritable solution, et vous ne pouvez pas m'écarter. Bien sûr, la valeur par défaut fonctionnera pendant 98% des personnes, mais je travaille sur des bases de données qui effectue dans l'ordre des transactions 90k P / S, et si vous bloquez d'optimisme d'autres lecteurs, le résultat peut être effectué en 2 jours à VS. . 2 heures. Donc, aucune insulte signifiait, ou destinée à GBN, désolé si cela est tombé mal



11
votes

Je suis un développeur sur une équipe d'outils dans l'org SQL chez Microsoft. Je ne suis en aucun cas autorisé à faire une déclaration officielle et je suis sûr qu'il y a des gens qui en savent plus sur ces choses que moi. Néanmoins, je vais offrir une règle de base amicale, le long du thème de "l'optimisation prématurée est la racine de tout mal":

N'utilisez pas Nolock (ou tout autre indice de requête à ce sujet) jusqu'à ce que vous ayez à faire. Si vous avez une instruction SELECT qui possède un plan de requête décent, et qu'il fonctionne bien lorsqu'il y a très peu d'autre charge sur le système, mais il ralentit ensuite lorsque d'autres requêtes accèdent à la même table, essayez d'ajouter des indices Nolock. Mais comprenez toujours que lorsque vous faites, vous courez le risque d'obtenir des données incohérentes. Si vous écrivez une application critique de mission qui fait bancaire en ligne ou contrôle un aéronef, cela peut être inacceptable. Toutefois, pour de nombreuses applications, la vitesse de conforme vaut le risque. Évaluer au cas par cas, cependant. Ne les utilisez pas simplement Willy Nillly partout sur la place.

Si vous choisissez d'utiliser NOLOCK, j'ai blogué une solution en C # à l'aide des méthodes d'extension, de sorte que vous puissiez facilement modifier une requête LINQ pour utiliser NOLOCK CONSEILS. Si vous pouvez l'adapter à EF4, veuillez publier votre adaptation.


0 commentaires

9
votes

EF4 n'a pas de manière intégrée pour le faire si EF4 génère toutes vos questions.

Il existe des moyens d'utiliser des procédures stockées ou un modèle de requête en ligne plus étendu, cependant, cela peut consommer du moins pour le moins.

Je crois (et je ne parle pas pour Microsoft sur ceci) que la mise en cache est la solution prévue de Microsoft pour éclaircir la charge sur le serveur dans les sites EF4. Ayant lu non engagé (ou Nolock) intégré dans un cadre créerait des problèmes imprévisibles pour le comportement attendu de l'EF4 lorsque 2 contextes sont exécutés en même temps. Cela ne signifie pas que votre situation a besoin de ce niveau de concurrence.

On dirait que vous avez été demandé à Nolock sur tous les éléments sélectionnés. Bien que je suis d'accord avec une affiche antérieure que cela peut être dangereux si vous avez des transactions qui doivent être des transactions, je ne suis pas d'accord qui rend automatiquement le DBA un muppet. Vous pouvez simplement exécuter un CMS totalement cool pour des lectures sales. Vous pouvez modifier le niveau d'isolation sur toute votre base de données pouvant avoir le même effet.

Le DBA peut avoir recommandé NOLOCK pour les opérations qui n'étaient que sélectionnées (qui conviennent bien, surtout s'il y a une ou une ormise en train d'être mal à la fois et de faire des vidages de données dus). La chose la plus drôle sur ce commentaire de Muppet est que la pile débordement est exécutant SQL Server en mode de lecture non engagée. Devinez que vous avez besoin de trouver ailleurs pour obtenir des réponses pour vos problèmes alors?

Parlez à votre DBA sur la possibilité de la définir sur un niveau de base de données ou envisager une stratégie de mise en cache si vous n'en avez besoin que dans quelques endroits. Le Web est apatride après tout ce que la simultanément peut souvent être une illusion de toute façon, sauf si vous y adressez la DIRECLTY.

Info sur les niveaux d'isolation


0 commentaires

2
votes

Bien que ce soit un pita majeur à faire, vous pouvez toujours déposer votre SQL dans une procédure stockée et obtenir les fonctionnalités dont vous avez besoin (ou être contraint). C'est définitivement un hack cependant!


0 commentaires

3
votes

Ayant travaillé avec EF4 depuis plus d'un an maintenant, je vais offrir que l'utilisation de procédures stockées pour des tâches spécifiques est pas un piratage et absolument nécessaire pour la performance sous certaines situations.

Notre plate-forme obtient beaucoup de la circulation via notre site Web, nos API et nos flux de données ETL. Nous utilisons EF principalement sur notre site Web, mais également pour certains processus de back-end. Parfois, ef fait un excellent travail avec sa génération de requête, parfois c'est terrible. Vous devez examiner les requêtes générées, les charger dans l'analyseur de requête et décider si vous feriez mieux d'écrire l'opération d'une autre manière (procédure stockée, etc.).

Si vous constatez que vous devez effectuer des données disponibles via EF et avez besoin Nolocks , vous pouvez toujours créer des vues avec le nolock indice inclus et exposer le Voir à ef au lieu de la table sous-jacente. La même chose peut être faite avec des procédures stockées. Ces méthodes sont probablement un peu plus faciles lorsque vous utilisez la première approche du code.

Mais je pense qu'une erreur de nombreuses personnes gagnent avec EF, c'est croire que le modèle d'objet EF doit faire mapper directement sur le modèle physique (table) de la base de données. Ce n'est pas et c'est là que votre DBA entre en jeu. Laissez-le concevoir votre modèle physique et vous travaillez ensemble pour résumer votre modèle de données logique mappé sur votre modèle d'objet dans EF.


0 commentaires