2010-10-18 6 views
0

J'ai un SPROC qui fonctionne toutes les heures. Ce SPROC calcule la popularité de l'illustration d'un utilisateur et met à jour la colonne de popularité sur le tableau des illustrations principales. C'est la même table où les utilisateurs écrivent à chaque fois qu'ils téléchargent une nouvelle illustration.Est-il possible de faire une 'mise à jour sale'?

Le problème est que ce fichier sproc est toujours bloqué par une autre transaction. Considérant que je ne suis pas préoccupé par le score réel de chaque œuvre (il suffit de présenter à peu près la qualité du contenu sur le site) et il n'a pas besoin d'être précis à 100% car ce score n'est pas public. Par conséquent, je voudrais être en mesure de faire une «mise à jour sale» sur cette colonne.

Est-ce possible?

+0

L'autre SPROC doit-il vraiment être dans une transaction? Si ce n'est pas déballer et que cela le corrigerait – Roadie57

Répondre

0

En supposant que vous émettiez une instruction de mise à jour unique pour effectuer les calculs pour la table entière, le moteur SQL Server obtient un UPDLOCK sur la table entière pendant qu'il effectue la transaction. La transaction prend probablement beaucoup de temps et c'est pourquoi vous voyez des conflits de verrouillage avec le système en ligne.

Vous pouvez vous assurer que la transaction meurt (soit la transaction en ligne soit votre score d'art SPROC) en utilisant SET DEADLOCK_PRIORITY soit BAS, soit ÉLEVÉ dans votre SPROC. Ensuite, demandez au perdant de vérifier l'erreur 1205 et réessayez s'il a été annulé.

L'autre (meilleur) choix serait probablement d'avoir votre système de notation d'œuvres d'art faire les mises à jour en morceaux. D'abord faire les A, puis les B, etc. De cette façon, la transaction serait plus rapide. (Vous pourriez avoir besoin de diviser les données en grains encore plus fins.Écrivez-les assez génériquement et testez-les)

+0

Je suis allé avec les mises à jour de bloc! Merci – super9

2

Je ne crois pas qu'il existe une mise à jour incorrecte. Il serait préférable d'étudier et de résoudre la condition de blocage.

0

Mettez un bloc TRY...CATCH autour de votre mise à jour.

Questions connexes