Question

Je ne suis pas un grand programmeur VB, mais je suis chargé de la maintenance / de l’amélioration d’une application de bureau VB6 utilisant Sybase ASE comme back-end. Cette application compte environ 500 utilisateurs.

Récemment, j'ai ajouté une fonctionnalité à cette application qui effectue une insertion / mise à jour supplémentaire sur une seule ligne de la base de données, le champ clé étant le numéro de transaction et le champ est indexé. La table mise à jour contient généralement environ 6000 enregistrements, car ceux-ci sont supprimés à la fin des transactions. Après le déploiement, l’application a fonctionné pendant un jour et demi avant que les utilisateurs ne signalent des performances médiocres.

Finalement, nous avons tracé le problème de performances jusqu'à un verrou de table dans la base de données et avons dû revenir à la version précédente de l'application. Le premier jour d'utilisation a été lundi, ce qui est généralement une journée très chargée pour le système. Je ne comprends donc pas pourquoi le problème n'apparaît pas ce jour-là.

Dans le code en place, un appel a été lancé pour démarrer une transaction Sybase. Dans le bloc entre BeginTrans et CommitTrans, il existe un appel à un fichier DLL qui met à jour la base de données. J'ai placé mon nouveau code dans un module de classe dans la DLL.

Je ne comprends pas pourquoi une simple insertion / mise à jour sur une seule ligne poserait un tel problème, d’autant plus que le système fonctionnait correctement avant la modification. Est-il possible que j'ai exposé un plus gros problème ici? Ou que je dois juste reconsidérer mon approche?

Merci à tous ceux qui se trouvent dans une situation similaire et peuvent donner des conseils.

Était-ce utile?

La solution

Il s’est avéré que le coupable était une boîte de message apparaissant dans le cadre des appels BeginTrans et CommitTrans. L'utilisateur avec la boîte de message maintiendrait un verrou de blocage sur la base de données jusqu'à ce qu'il ait acquitté le message. La solution consistait à déplacer la boîte de message en dehors de la portée susmentionnée.

Autres conseils

Je ne parviens pas à comprendre la totalité de l'image sans le code SQL que vous utilisez.

De plus, s’il s’agit d’une simple insertion OU d’une mise à jour, pourquoi utilisez-vous une transaction? Est-il possible que de nombreux utilisateurs essaient de mettre à jour la même ligne?

Il serait utile de publier à la fois le code VB et votre code SQL (avec le plan de requête si possible). Cependant, avec les informations dont nous disposons; J'exécuterais update statistics nom_table sur la table pour vérifier que le plan de requête est à jour.

Si vous êtes certain que votre code doit être exécuté dans une transaction, avez-vous essayé d'ajouter votre propre bloc de transactions contenant votre code SQL plutôt que d'utiliser celui qui y était déjà?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top