|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 :-) |
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 256 ![]() |
mauvaise idée, utilise les générateurs
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 |
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 :-) |
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 256 ![]() |
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 |
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 :-) |
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 256 ![]() |
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 |
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 :-) |
|
|
00
|
|
|
#9 |
|
Membre chevronné
![]() Inscription : janvier 2009 Messages : 396 ![]() |
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 |
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 :-) |
|
|
00
|
|
|
#11 | |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 256 ![]() |
Citation:
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 |
|
|
00
|
|
|
#12 | ||
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
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 :
|
||
|
|
00
|
|
|
#13 | |
|
Expert Confirmé
![]() ![]() ![]() Philippe MakowskiConsultant spécialité Firebird Inscription : mai 2002 Messages : 2 256 ![]() |
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:
__________________
Philippe Makowski IBPhoenix - Firebird Membre de l'April |
|
|
00
|
|
|
#14 |
|
Invité régulier
![]() Inscription : mai 2002 Messages : 98 ![]() |
Merci grand maitre
J'ai beaucoup appris grâce à vous ces derniers temps Merci encore :-) |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com