Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 12/09/2011, 15h45   #1
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Par défaut Update de table sur du multiposte (delphi)

Bonjour,

J'ai cru comprendre la notion de transaction mais je suis perdu dans un cas précis d'update.

Explication :

1 - Je débute une transaction
2 - Je récupère un compteur de facture dans une table (requête select)
3 - Je fais un Inc(nofacture)
4 - je fais une maj de compteur de facture dans la table (requête update)
5 - je fais la suite : insert table facture, insert table ligne de facture,...
6 - fin de transaction (si tout est ok)

Questions :
- Comment empêcher d'avoir le même no de facture si 2 postes enregistrent des factures au même moment ?
- Il me semblait que les transactions seules permettaient de gérer cela ?
- Quelqu'un pourrait-il me montrer un exemple de code pour éviter ce genre de conflits ?
- Qu'est ce qui serait préférable pour l'exécution du code : code client ou procédure stockée avec passage de paramètre ?

Merci d'avance pour votre aide :-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h20   #2
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 256
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 256
Points : 3 576
Points : 3 576
mauvaise idée, utilise les générateurs
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 17h33   #3
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Bonsoir et merci pour votre réponse..
J'ai bien pensé aux générateurs mais :
1- je ne vois pas comment les utiliser dans mon cas de no de facture car
c'est un no spécial du genre A ou F + mois + incrément compteur
2- cela ne me dit pas si via générateur le multiposte fonctionnera pas automatiquement
3- je poserai le même problème pour une maj de qté stock dans une table ART

Merci
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 21h57   #4
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Bonsoir

Autrement dit, pour éviter que 2 postes n'entrent en conflit en enregistrant en même temps, j'utilise le code suivant :

1. try
2. ibtransaction1.starttransaction
3. requête ibquery pour lire le compteur avec blocage de l'enrgt :
select compteur_facture
from table_compteur
with lock
where code_compt = 'NOF'
4. je récupère le compteur dans une variable compt
5. Inc(compt)
6. Maj du nouveau compteur via ibquery
Update table_compteur
set compteur_facture = :compt
where code_compt = 'NOF'
7. ibtransaction.commit
8. except
9. ibtransaction.rollback
10. end


Si j'enlève le WITH LOCK dans le SELECT, j'obtiens des messages DEADLOCK.
J'ai tjrs pensé que la simple utilisation des transactions pouvait remédier ce genre de problèmes.
Est-ce bien de cette façon qu'il faut coder ?
Y-a-t-il un autre moyen d'y remédier ?
Serait-il préférable d'utiliser des procédures stockées ?
Avant avec des tables paradox, un simple EDIT sur la table bloquait l'enregistrement.

Merci d'avance pour votre aide :-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 11h06   #5
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 256
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 256
Points : 3 576
Points : 3 576
le WITH LOCK est une des solutions
va lire :

http://www.ibobjects.com/TechInfo.ht...uditableSeries
et

http://www.ibphoenix.fr/spip.php?article39
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 12h00   #6
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Bonjour et merci pour votre réponse

Toujours en conflit avec une personne qui prétend le contraire :

On prétend que la simple utilisation du composant tibtransaction (starttransaction) et commit suffit pour que le serveur de sgbd fiebird
puisse gérer tout seul les blocages d'enrgt.
Est-ce vrai ?
Ou est-ce à nous de compléter la propriété params du composant tibtransaction selon qu'il faille ou non bloquer des enrgt. ?

Merci d'avance pour une réponse très précise.
Cela m'aiderait à mettre les points sur les i une bonne fois pour toute
avec certaines personnes qui ne développent et prétendre le contraire.

merci encore :-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 15h03   #7
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 256
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 256
Points : 3 576
Points : 3 576
Un TIB... déjà c'est pour Interbase, pas pour Firebird
ensuite je ne sais pas quel type de transaction les TIB utilise par défaut
ceci dit, c'est au dev de dire quel type de transaction il veut utiliser, toujours.
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 16h28   #8
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Ah bon !!! il y aurait donc d'autres composants pour firebird ? lesquels ?
Si TOB c'est pour interbase, pour firebird c'est quoi ?

Quel type de transaction je voudrais ?
Cest simple, 2 personnes enregistrent des factures :
1. quels options utiliser dans les parametres de la transaction pour éviter d'avoird des lock conflit, deadlock ?
2. J'ai toujours cru que les TIB pouvaient être utilisés pour Firebird
3. Je n'arrive toujours pas (sans utiliser WITH LOCK) à gérer le multiposte
sur une base firebird

Merci :-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 08h41   #9
seabs
Membre chevronné
 
Inscription : janvier 2009
Messages : 396
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 396
Points : 639
Points : 639
Bonjour,

Effectivement, il existe d'autres composants pour travailler avec Firebird. Je dirai même qu'ils sont recommandés.

Vas voir cette discussion, tu auras toutes les explications.

http://www.developpez.net/forums/d11...cter-firebird/

En gratuit, le meilleur est à mon avis UIB. Après, il faut un peu d'investissement en temps pour maîtriser tout cela.

Personnellement, j'emploie ZeosDBO version 6.6.6, je suis avec Firebird 2.1.4. J'ai fait quelques adaptations pour répondre à mes besoins. Ces composants ne fonctionnent pas avec Firebird 2.5, il faudra attendre la version 7.0. Ces composants sont également gratuits.

La prise en main de ZeosDBO est simple et rapide.

Bon courage
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h10   #10
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Bonjour et merci pour votre réponse
En effet, j'ai bien vu en particulier FIBPlus mais pas encore
les composants ZeosDb

Peut-être votre grande expérience pourra aide un pauvre
débutant en dev. sql sous delphi

Est-ce vrai que les transactions à elles seules permettent de gérer
le blocage des enregistrements en automatique ?
Ou faut-il bien paramétrer les transactions en fonction de ce que l'on veut faire ?
Exemple :
1. Je lis un compteur dans une table (requete select)
2. J'incrémente le compteur
3. Je met à jour le compteur dans la table (requete update)

Comment éviter les messages deadlock et "lock conflit" si plusieurs personnes
exécutent le code ?
Est-ce au developpeur de bloquer l'enregistrement ou est-ce la transaction ?

Ce serait pratique si j'avais un exemple de code source

Merci d'avance pour votre aide :-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 10h53   #11
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 256
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 256
Points : 3 576
Points : 3 576
Citation:
Envoyé par asenaici Voir le message
Comment éviter les messages deadlock et "lock conflit" si plusieurs personnes
exécutent le code ?
ça ne s'"évite pas", cela ce gère, c'est tout
ensuite en général en read committed record version, ce genre de conflit est plus rare
mais pas grave
encore une fois cela ce gère
il y a un conflit ?
et bien je retente ma chance ou bien j'informe l'utilisateur du conflit, du genre "cet enregistrement a été modifié par un autre utilisateur, voir la dernière version ?" etc etc
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 11h02   #12
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Bonjour,
Désolé de ma lenteur mais je commence à comprendre

Donc c'est bien au développeur de gérer cette situation et non
aux transactions de le faire de manière automatique.

Merci à tous pour votre aide et désolé si je vous ai paru insistant.
Une toute dernière chose et je pourrai développer en paix.

Vous dites qu'il fat le gérer, d'accord mais alors avec des exceptions ?
Si oui il faut capter un no d'erreur correspondant à un deadlock ou lock conflit ?
Si oui quel no d'erreur ?
Pouvez-vous compléter mon code svp ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Try
   if UIBTransaction1.InTransaction then
      UIBTransaction1.Commit;
   UIBTransaction1.StartTransaction;
   UIBQuery1.ExecSql;
   UIBTransaction1.Commit;
   Except
     On e : exception do
     begin
       UIBTransaction1.RollBack;
       ShowMessage(e.Message);
     end;
End;
Merci infiniment pour votre aide :-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 16h42   #13
makowski
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 256
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 256
Points : 3 576
Points : 3 576
les codes d'erreur sont là : http://www.firebirdsql.org/en/reference-manuals/

quand au rollback dans l'exception, il n'est pas necessaire, un commit coute moins cher
cf http://www.ibphoenix.fr/spip.php?article39 dans
Citation:
Et à la fin : COMMIT ou ROLLBACK ?
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2011, 17h08   #14
asenaici
Invité régulier
 
Inscription : mai 2002
Messages : 98
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 98
Points : 7
Points : 7
Merci grand maitre
J'ai beaucoup appris grâce à vous ces derniers temps
Merci encore
:-)
asenaici est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h34.


 
 
 
 
Partenaires

Hébergement Web