Précédent   Forum des professionnels en informatique > Autres langages > Pascal > Lazarus
Lazarus Forum d'entraide sur Lazarus, l'EDI RAD multiplateforme basé sur Free Pascal
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 26/01/2012, 16h42   #1
Invité de passage
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 4
Points : 4
Par défaut MySQL : Impossible de désactiver TSQLTransaction

Bonjour,
Dans un projet sous MySQL, lors de la fermeture de l'application, un message :"SQLTransaction1:Operation cannot be performed on an active transaction" apparaît.
Après moult essais et tests, j'en arrive à la conclusion qu'il m'est impossible de passer la transaction à false.
Est-ce un bug Lazarus ?
Peut-on le contourner ?

Merci d'avance.

Lazarus 0.9.30.2
MySQL 5.0
Philippe_2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 08h50   #2
Membre confirmé
 
Développeur informatique
Inscription : janvier 2010
Messages : 177
Détails du profil
Informations personnelles :
Âge : 54

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2010
Messages : 177
Points : 214
Points : 214
Citation:
Envoyé par Philippe_2010
il m'est impossible de passer la transaction à false
Que signifierait une "transaction à false" ??
Tu peux faire soit un Commit, soit un Rollback pour la terminer.
__________________
Cordialement,
Tintinux

Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
Elle est en cours de développement, avec Lazarus. Vous pouvez peut-être aider à la tester, la traduire et même à la développer.
tintinux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 11h54   #3
Invité de passage
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 4
Points : 4
Citation:
Envoyé par tintinux Voir le message
Que signifierait une "transaction à false" ??
Tu peux faire soit un Commit, soit un Rollback pour la terminer.
Merci pour ta réponse, mais j'ai un plantage lors de la fermeture de mon appli avec un message "Operation cannot be performed on an active transaction".
J'ai donc essayé de la désactiver dans le formclose...Impossible, même après Commit et Rollback.
Philippe_2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 12h14   #4
Membre confirmé
 
Développeur informatique
Inscription : janvier 2010
Messages : 177
Détails du profil
Informations personnelles :
Âge : 54

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2010
Messages : 177
Points : 214
Points : 214
C'est sans doute dans le OnCloseQuery qu'il faut s'assurer qu'il n'y a pas une transaction active, et si c'est le cas la fermer par un Commit ou Rollback, après confirmation.

Dans le OnClose, ça risque d'être trop tard...

Sinon, il faudrait que tu essaies de déterminer, avec le débogueur, où ça plante exactement. Tu as typiquement ce message quand tu démarres une transaction déjà active.

Je serais étonné qu'il y ait un bug dans Lazarus sur ce point, mais il pourrait y en avoir un dans ton appli... par exemple, si en fermant tu modifies la valeur d'un champ et que le OnChange de ce champ démarre une transaction...

Ceci dit, il est assez rare qu'on ait besoin d'avoir une transaction ouverte en permanence. Le plus souvent, on ne la démarre que juste avant de faire une saisie, et on la ferme juste après un Update (ou Post).
__________________
Cordialement,
Tintinux

Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
Elle est en cours de développement, avec Lazarus. Vous pouvez peut-être aider à la tester, la traduire et même à la développer.
tintinux est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/01/2012, 12h22   #5
Invité de passage
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 4
Points : 4
Citation:
Envoyé par tintinux Voir le message
C'est sans doute dans le OnCloseQuery qu'il faut s'assurer qu'il n'y a pas une transaction active, et si c'est le cas la fermer par un Commit ou Rollback, après confirmation.

Dans le OnClose, ça risque d'être trop tard...

Sinon, il faudrait que tu essaies de déterminer, avec le débogueur, où ça plante exactement. Tu as typiquement ce message quand tu démarres une transaction déjà active.

Je serais étonné qu'il y ait un bug dans Lazarus sur ce point, mais il pourrait y en avoir un dans ton appli... par exemple, si en fermant tu modifies la valeur d'un champ et que le OnChange de ce champ démarre une transaction...

Ceci dit, il est assez rare qu'on ait besoin d'avoir une transaction ouverte en permanence. Le plus souvent, on ne la démarre que juste avant de faire une saisie, et on la ferme juste après un Update (ou Post).
Tu veux dire que tu active la transaction avant chaque Query et que tu la désactive systématiquement ensuite ?
Philippe_2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2012, 14h30   #6
Membre confirmé
 
Développeur informatique
Inscription : janvier 2010
Messages : 177
Détails du profil
Informations personnelles :
Âge : 54

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2010
Messages : 177
Points : 214
Points : 214
Cela dépend entièrement de ce que dois faire ton programme !

Une transaction ne sert qu'à s'assurer que plusieurs requêtes sont soit exécutées, soit annulées ensemble.

Si tu n'as qu'une seule requête de mise à jour, et que tu n'es pas en environnement multi-utilisateurs, donc sans besoin de poser un verrou, il est totalement inutile de gérer une transaction. Il suffit de laisser le SGBD s'en occuper et il y a une propriété pour ça.

Sinon, quand une transaction doit être gérée par le programme, on essaie effectivement de la faire aussi courte que possible, en évitant de préférence qu'elle ne puisse durer indéfiniment.
__________________
Cordialement,
Tintinux

Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
Elle est en cours de développement, avec Lazarus. Vous pouvez peut-être aider à la tester, la traduire et même à la développer.
tintinux est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/02/2012, 12h03   #7
Invité de passage
 
Inscription : décembre 2010
Messages : 10
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2010
Messages : 10
Points : 4
Points : 4
Citation:
Envoyé par tintinux Voir le message
Cela dépend entièrement de ce que dois faire ton programme !

Une transaction ne sert qu'à s'assurer que plusieurs requêtes sont soit exécutées, soit annulées ensemble.

Si tu n'as qu'une seule requête de mise à jour, et que tu n'es pas en environnement multi-utilisateurs, donc sans besoin de poser un verrou, il est totalement inutile de gérer une transaction. Il suffit de laisser le SGBD s'en occuper et il y a une propriété pour ça.

Sinon, quand une transaction doit être gérée par le programme, on essaie effectivement de la faire aussi courte que possible, en évitant de préférence qu'elle ne puisse durer indéfiniment.
Merci pour vos réponses.
Après avoir lu vos conseils, j'ai vérifié ce qui pouvait empêcher de fermer ces transactions. En fait, j'ai fait pointer une DataSource vers un Query situé sur une autre Form... Pas bonne idée...
J'imagine que lors de la fermeture de l'appli, les Forms se ferment dans un ordre qui fait que la Datasource n'est pas fermée lors de la fermeture du Query, et donc de la Transaction.
Résolu !
Merci encore
Philippe_2010 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 23h15.


 
 
 
 
Partenaires

Hébergement Web