C'était ma question originale:
J'essaie de comprendre comment appliquer des verrous de table exclusifs dans SQL Server. Je dois travailler autour des lecteurs peu coopératifs (au-delà de mes trucs de la source fermée) qui définissent explicitement leur niveau d'isolement pour lire non engagés. L'effet est que peu importe le nombre de verrous et quel type d'isolement je spécifie tout en effectuant une insertion / mise à jour, un client doit simplement définir le bon isolement et est de retour à la lecture de ma poubelle en progrès. I> p>
La réponse s'est avérée assez simple - P>
Bien qu'il n'y ait aucun moyen de déclencher une serrure explicite, tout changement DDL déclenche le verrou que je cherchais. p> BlockQuote>
Bien que cette situation ne soit pas idéale (les blocs du client au lieu d'assister à des lectures répétables), il est bien meilleur que de laisser le client remplacer l'isolement et de lire des données sales. Voici le code d'exemple complet avec le mécanisme de verrouillage factice-Trigger p>
gagnant! P>
xxx pré> résultat: h2>
xxx pré > p>
3 Réponses :
Ajouter un indice de verrouillage à votre et mettre votre Si votre instruction initiale est dans une transaction explicite, le Sélectionnez CODE>: P>
SELECT compte (*) de l'artiste avec (nappx) code> p>
insérer code> dans une transaction. p>
SELECT CODE> attendra un verrou avant son processus. P>
Étant donné que son problème est avec des niveaux d'isolation, il suffit d'utiliser avec (readalis) code> car l'indice devrait suffire.
@Peter - Êtes-vous pas en mesure de changer les questions?
Quelle partie du logiciel 3ème partie à la source fermée n'était pas claire? :))))
+1 Parce que je cherchais un moyen de simuler un délai d'attente sur une lecture causée par une table verrouillée! (Ceci est pour un test unitaire)
Il n'y a pas de moyen direct de forcer le verrouillage lorsqu'une connexion est dans le niveau code> non engagé code> Niveau d'isolation. P>
Une solution serait de créer des vues sur les tables en cours de lecture qui fournissent l'indice de table code> code>. Si vous contrôlez les noms de table utilisés par le lecteur, cela pourrait être assez simple. Sinon, vous aurez une corvée tout comme vous devez modifier les écrivains pour écrire à de nouvelles tables ou créer EDIT: P>
Michael Fredrickson est correct en signalant qu'une vue simplement définie comme une sélection d'une table de base avec une indice de table ne nécessiterait aucune définition de déclenchement pour être mise à jour. Si vous souhaitez renommer les tables problématiques existantes et les remplacer par des points de vue, le client tiers devrait ne pas être plus sage. P> au lieu d'insérer / mettre à jour code> déclencheurs sur les vues. P>
Je suis d'accord ... C'est une bonne solution pour les exigences. Renommez la table de l'artiste à Tblartist, puis créez simplement une vue Artiste nommée autour de la table Tblartist et utilisez un indice de verrouillage dans la vue pour remplacer ce que fait le client.
@M. Fredrickson: Le client lit et écrit à ces deux tables, une vue n'est pas viable non plus.
@Peter: Cela ne fait pas moins de hack .. mais cette vue répondrait aux exigences relatives à une "vue mise à jour", et peut être insérée / mise à jour / supprimée.
+1 pour Vue mises à jour code> Réponse, répond entièrement à la question sans utiliser de comportement pouvant changer ultérieurement (changements DDL). Dans les systèmes, je travaille avec si nous devons fournir un accès direct SQL, il est exclusivement via des vues et nous assurons que nous avons des déclencheurs en place pour valider les données avant de mettre à jour les tables.
Un piratage de hack hack Way de le faire consiste à forcer une opération sur la table qui prend une serrure Sch-M sur la table, ce qui empêchera les lectures de la table même dans le niveau d'isolement non engagé. Par exemple, faire une opération comme Alter Table Recuild (peut-être sur une partition vide spécifique pour réduire l'impact des performances) dans le cadre de votre opération empêchera tout accès simultané à la table jusqu'à ce que vous vous engagiez. p>
Oooooh maintenant c'est quelque chose que j'aime. Expérimentera avec après les heures et fera rapport.
Et c'est bien comment le faire, et ce n'est même pas trop hacky. Je dirais même assez élégant :) Voir Modification de la question originale de réponse