2008-11-14 9 views
2

J'ai une procédure stockée sur SQL Server 2005 effectuant une transaction sérialisable. Dans cette transaction, il sélectionne une table avec rowlock. À la fin de la procédure, après rollback/commit, il définit le niveau d'isolation de la transaction sur Read Commited.SQL Server ne peut pas obtenir une ressource LOCK pour le moment - Que faire?

Cette procédure est en cours d'exécution, les différents processus ont un accès simultané contrôlé par ces contraintes, mais tout à coup, après un certain temps, certains processus jeter un Sql Exception:

L'instance du moteur SQL Server de base de données ne peut pas obtenir une ressource LOCK en ce moment. Réexécutez votre instruction lorsqu'il y a moins d'utilisateurs actifs . Demandez à l'administrateur de la base de données de vérifier la configuration du verrou et de la mémoire pour cette instance ou de de vérifier les transactions de longue durée.

Ceci n'est pas prévisible, cela peut arriver tôt, ou après une heure.

Que puis-je faire pour résoudre ce problème?

Répondre

3

vous avez trop de verrous pour votre mémoire. augmentez la mémoire vive ou réécrivez vos requêtes pour utiliser moins de verrous. sérialisable est un porc de verrouillage. En avez-vous vraiment besoin?

+0

+1 Tout à fait d'accord. Avez-vous vraiment besoin d'une transaction sérialisable? –

+1

C'est ce que fait le responsable de l'entreprise lors de l'enregistrement des changements de table. Quelqu'un de l'équipe SQL Server a décidé que j'avais besoin d'un niveau de transisolation serializalbe. –

0

Je résolus cette erreur en réduisant la plage de données été passé entre les serveurs, sens si vous sélectionnez 1000 enregistrements essayez de réduire la transaction en deux lots pour 500 dossiers et 500 dossiers garder réduire le nombre jusqu'à ce que cesse l'erreur

Questions connexes