Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Débuter
Débuter Forum d'entraide pour débuter avec Firebird
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 12/11/2004, 18h28   #1
Membre du Club
 
Inscription : février 2004
Messages : 166
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 166
Points : 67
Points : 67
Par défaut petite aide sur les transactions et triggers SVP



slt

1 :
D'aprés ce que j'ai compris en lisant les posts, il faut utiliser des transactions différentes pour chaque type d'accés à une base ( INSERT, UPDATE, LECTURE,DELETE). Pour résumer il faut donc au moins 4 composants transactions ( + 1 pour le composant IbDatabase ).

2 :
Les transactions sont initiées par les clients avec :
Code :
1
2
3
4
 
MaTransaction.Start;
MaTransaction.Commit;
MaTransaction.RoolBack;
3 :
Dans le cas ou on utilise une transaction spécifique pour un évènement ( par ex : INSERT ) on fera pour valider l'insertion un CommitRetaining, et un RoolbackRetaining pour annuler ces insertion. Il faut auparavant vérifier je suppose s'il s'agit bien de la transaction souhaitée ? avec un InTransaction :
Code :
1
2
 
IF matransaction.InTransaction
4 :
Est ce que IB6 affiche un message si un client essaie de modifier un enreg si un autre client est en train de le visualiser ou de le modifier par exemple ?

5 : faut il mieux utiliser un trigger ou une PS pour signaler à un client par exemple que l'enreg qu'il a saisi existe déja ?
Car dans une PS si on détecte que l'enreg existe déja, on l'annule par un roolback, alors que dans le trigger le traitement se fera dans l'évenement BEFORE_INSERT par exemple ! Quelle est la meilleure solution ?

Merci
A+
CharleLéo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2004, 10h00   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: petite aide sur les transactions et triggers SVP

1 : Non on peut tout faire avec une transaction. De même que l'on peut utiliser une transaction différente par gros traitement (par écran par exemple) et en effet certains preferent utiliser une transaction pour les select et une autre pour les mises à jours (Insert/update/delete)

2 :Oui c'est fait automatiquement lors de l'ouverture d'un IBDataSet ou IBQuery ou ...
Par contre pour la fermer il est en effet preférable de le faire mannuellement car comme ca vous maitrisez le moment ou vous valider ou annuler vos modifications.

3 :Non le InTransaction retourne un resultat Boolean. Il indique juste si une transaction est en cours (ouverte). Afin d'éviter de faire un Start alors que la transaction est dejà ouverte ou de faire un commit ou rollback alors que la transaction est déjà fermée.

4 :Si une autre personne visualise sur son écran un enregistrement que vous modifiez et validiez (Commit) la personne ne le verra pas. Pour voir les modification il faut qu'elle rafraichisse son enregistrement (à Condition que la transaction soit en mode readcommited car si elle est en mode snapshot il faut fermer la transaction et la réouvrir).
Par contre si elle essaye de modifier l'enregistrement de son écran que vous avez modifié (sans qu'il ne l'ai vue) il aura un message d'erreur lui indiquant qu'une autre personne à déjà modifié son enregistrement. Il faut donc commencer par rafraichir l'enregistrement pour pouvoir le modifier et avoir la dernière version.

5 ans les PS et les triggers vous ne pouvez pas faire de rollback ou commit. Au mieux vous pouvez annuler le traitement en levant une exception.

Les triggers et les PS ne s'utilisent pas de la même façon, a vous de voir ce que vous trouvez le plus pratique.

Le trigger sera déclanché (et donc votre controle) pour chaque insert (que vous le fassiez depuis votre application ou depuis IBConsole)
alors que la PS (et donc le controle que vous ferez dedans) ne sera déclanché que lorsque vous l'utiliserez. (Donc celà vous laisse la possibilité de faire des insert sans controle).
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2004, 16h15   #3
Membre du Club
 
Inscription : février 2004
Messages : 166
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 166
Points : 67
Points : 67

Merci barbubulle pour ces explications, je commence à entrevoir le bout du tunnel.
Vous dites :
Citation:
Non le InTransaction retourne un resultat Boolean. Il indique juste si une transaction est en cours (ouverte). Afin d'éviter de faire un Start alors que la transaction est dejà ouverte ou de faire un commit ou rollback alors que la transaction est déjà fermée.
en fait on vérifie que le client A n'a pas déja lancé une transaction ( et seulement ce client là ) ? Le client A ne s'occupe pas de savoir si un client B a lancé une transaction nest ce pas ?
D'autre part :
Code :
 MaTrans.StartTransaction
n'est donc pas obligatoire puisqu'il est automatique à l'ouverture d'un IBQUERY ou d'un IBDATASET d'une PS ..., mais fortement conseillé afin d'avoir la main mise sur les traitement ?

merci encore a+
CharleLéo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2004, 17h02   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par CharleLéo
en fait on vérifie que le client A n'a pas déja lancé une transaction ( et seulement ce client là ) ? Le client A ne s'occupe pas de savoir si un client B a lancé une transaction nest ce pas ?
Vous n'avez pas connaissance des autres transactions.
Le composant IBTransaction ne permet d'ouvrir qu'une seule transaction à la fois. Et donc la propriété InTransaction de ce composant indique simplement si la transaction est ouverte ou pas.


Citation:
Envoyé par CharleLéo
D'autre part :
Code :
 MaTrans.StartTransaction
n'est donc pas obligatoire puisqu'il est automatique à l'ouverture d'un IBQUERY ou d'un IBDATASET d'une PS ..., mais fortement conseillé afin d'avoir la main mise sur les traitement ?
Non puisque une simple IBDataSet.Open; va automatiquement faire le StartTransaction si le InTransaction est à False. On ne peut rien faire sans qu'une transaction ne soit ouverte sous Interbase.
Ce qui est fortement conseillé c'est de faire un commit ou RollBack de manière explicite dans votre programme.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2004, 20h43   #5
Membre du Club
 
Inscription : février 2004
Messages : 166
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 166
Points : 67
Points : 67


merci pour tout Barbibulle, je ferais surement un post pour reprendre un peu tout ca

a+

CharleLéo 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 +2. Il est actuellement 08h11.


 
 
 
 
Partenaires

Hébergement Web