|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Bonjour à tous,
Je vous expose mon problème. J'ai 2 BDD (une sous Access et l'autre sous MySQL). Dans ces tables je gère des mouvements de stocks et je souhaite créer une interface entre ces deux BDD. Pour cela j'utilise un programme en C, cependant je suis confronté à un petit problème. Voici mes deux BDD : Access : - Mouvement(N°, Etat, Rapprochement, Ref_Produit, Quantite, Type_Mouvement) Rapprochement vaut 'N' si le tuple n'a pas encore été enregistré dans l'autre base de données, il vaut 'R' sinon. - Interface(id_mvt) id_mvt est l'id du dernier mouvement rapproché qui a été enregistré sur la BDD MySQL. MySQL : - Mouvement(id_mvt, Type_mvt, Ref_Produit) L'id_mvt est auto incrémenté. J'avais prévu que le script fonctionne de cette façon : 1/ On récupère les mouvements côté MySQL dont l'id est supérieur au plus grand id_mvt de la table Interface. 2/ On récupère les mouvements côté Access (Etat = 'Livré' et Rapprochement = 'N') qu'on enregistre dans la table Mouvement côté MySQL. 3/ On récupère l'id_mvt maximum de la table Mouvement côté MySQL pour l'enregistrer dans la table Interface. C'est entre l'étape 1 et 2 que mon problème se pose. En effet, si un mouvement de stock est ajouté entre ma requête de récupération (1) et ma requête d'insertion (2), alors le tuple de ce mouvement ne sera jamais traité. La probabilité est assez faible mais existante, et comme le script sera exécuté très régulièrement, cela multiplie les risques que certains mouvements ne soient pas pris en compte. De plus j'ai une contrainte : je ne peux pas modifier ou ajouter de table du côté MySQL. Sinon il m'aurait suffit de rajouter un champ Rapprochement du côté MySQL pour savoir si le tuple avait déjà été traité ou non. Connaissez-vous une solution ou un moyen de contourner problème ? Merci par avance ! |
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 916 ![]() |
J'ai peut-être une idée, mais ça va alourdir l'ensemble :
- stocker la dernière donnée récupérée par (1) dans une table access avec un timestamp - mais les timestamp access ne sont pas super fiables sous la seconde - stocker la dernière donnée récupérée par (2) dans une autre table access avec un timestamp, ie relancer la requête (1) après la (2) - tester si ces 2 valeurs sont égales, et rattraper les mouvements perdus C'est pas simple, comme problème. D'autre part, je ne pense pas qu'ajouter un champ 'Rapprochement' dans la table mysql serait possible, car autant un access peut lire dans un mysql, je ne vois pas comment le contraire est possible. Bon courage |
|
|
10
|
|
|
#3 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Bonjour guidav,
Je ne lis pas directement d'une BDD dans l'autre, je me connecte grâce à une libraire ODBC aux deux BDD dans mon script en C. Du coup, un champ Rapprochement me permettrait de spécifier les champs que le script a récupéré. Ainsi toutes mes requêtes de récupération auraient une clause WHERE Rapprochement = 'N'. Il s'agit d'un script exécuté toutes les 15 minutes, donc même si un mouvement de stock est effectué pendant l'exécution du script, il serait récupéré 15 minutes plus tard. J'ai tenté d'imaginer plusieurs solutions, comme récupérer dans un premier temps les données d'Access, les écrire dans la BDD MySQL et récupérer le MAX(id_mvt) de MySQL, mais le problème est le même si un mouvement de stock est ajouté juste avant de faire la requête de récupération du MAX(id_mvt). En tous cas merci pour ta proposition, mais j'ai peur que le problème revienne au même si un mouvement de stock est ajouté juste avant l'écriture des mouvements de stocks dans la BDD MySQL, quel que soit le nombre de vérification que l'on fasse. N'y-a-t'il pas des systèmes de files d'attente de requêtes qui permette de bloquer momentanément l'exécution de requêtes sur des BDD pendant l'exécution d'un script? |
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() Inscription : mai 2004 Messages : 739 ![]() |
Tu peux utiliser la notion de LOCK.
Tu lock la table qui ne doit pas être modifiée le temps de ton opération et tu enlève le lock ensuite. Je ne connais pas bien ACCESS donc je ne sais pas en pratique comment le faire dans ton cas, mais ça doit exister.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela. La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber. (\ _ /) (='.'=) Voici Lapinou. Aidez le à conquérir le monde (")-(") en le reproduisant |
|
|
10
|
|
|
#5 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Je vais essayer de me tourner vers le lock, et la BDD Access n'est pas un problème, c'est au niveau de la table MySQL que mon problème se présentait. En effet le LOCK semble pouvoir être une bonne alternative.
J'ai juste 2 petites questions au sujet du LOCK. Si une requête est effectuée pendant qu'une table est verrouillée, est-ce que cette requête s'effectue lorsque la table est déverrouillée ? Si je LOCK une table dans mon script, est-ce que je peux quand même écrire dedans depuis mon script tout en bloquant les requêtes "externes"? Merci beaucoup pour cette piste |
|
|
00
|
|
|
#6 | |
|
Membre émérite
![]() Inscription : mai 2004 Messages : 739 ![]() |
Citation:
Il y a différents types de LOCK. Mais je ne suis pas un expert dans le domaine. Donc je prefere ne pas répondre que te dire une bétise sur ce point.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela. La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber. (\ _ /) (='.'=) Voici Lapinou. Aidez le à conquérir le monde (")-(") en le reproduisant |
|
|
|
10
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Je n'ai plus qu'à faire des tests pour vérifier ma deuxième question, merci beaucoup pour tes réponses qui me sont très utiles !
|
|
|
00
|
|
|
#8 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 916 ![]() |
Bien vu le coup du lock. Sinon, définir une fonction utilisateur et faire passer le tout dans une transaction ? A condition de pouvoir mettre la fonction en C sur le serveur sql, mais je ne sais pas si c'est possible et si tu y as un accès suffisant (probablement pas, si tu ne peux pas créer de table).
Je pense que le lock est la meilleure solution, en effet. |
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Le seul moyen efficace est de faire une requête interserveur avec un COMMIT à deux phases. Problème MySQL ne sait pas faire !
Ce n'est pas la seule limite de MySQL... A lire : Avec votre lock, vous allez pourrir dramatiquement les performances de vos deux SGBDR et comme ACESS est lent et MySQL aussi, vous aurez au final une application inexploitable ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#10 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Bonjour SQLPro.
Merci pour ce coneil. Cependant, mon script ne sera exécuté que toutes les 15 minutes, est-ce que cela va influer aussi fortement que vous ne le dites sur les performances des SGBDR? Merci |
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Tout dépend du nombre d'utilisateurs.... Mais pour ce genre de choses il serait souhaitable de travailler de manière asynchrone.
Par exemple renseigner quelque chose dans la base via un trigger de manière synchrone et avoir une tache planifié qui va faire la migration régulièrement. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#12 |
![]() ![]() ![]() |
Est ce que tu peux nous dire pour quelle raison tu veux faire ce bricole ?
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#13 |
|
Membre chevronné
![]() Inscription : janvier 2006 Messages : 916 ![]() |
J'ai l'impression qu'il doit synchroniser 2 bases, sachant qu'il est possible d'écrire dans les 2 en même temps.
Autant dire que c'est rarement simple à mettre en œuvre. |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Oui voilà, j'ai des tables à synchroniser (dans 2 BDD différentes, Access et MySQL) pour toujours avoir les mêmes stocks des deux côtés et il m'est impossible de modifier la structure d'une des deux bases de données (MySQL).
J'ai réussi à mettre en place ce système en programmant un petit script qui a recoure au LOCK. Ce script s'exécute en à peine 1 seconde toutes les 15 minutes. Donc je ne sais pas si cela modifie énormément les performances de mes BDD, d'autant plus que le nombre d'utilisateur devrait être relativement raisonnable. |
|
|
00
|
|
|
#15 |
![]() ![]() ![]() |
Est ce que tes lock sont posés les commandes LOCK ou gérés via les transactions ?
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
|
|
#16 |
|
Invité de passage
![]() Inscription : juillet 2008 Messages : 12 ![]() |
Via la commande LOCK
|
|
|
00
|
|
|
#17 |
![]() ![]() ![]() |
Si ta version de MySQL supporte les transactions, je te conseillerais d'utiliser les transactions avec un bon niveau d'isolation.
__________________
Découvrez la FAQ de MS SQL Server. La chance accorde ses faveurs aux esprits avertis ! |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com