Multi accès sur une base de données

Résolu
azerty2005 Messages postés 4 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 14 janvier 2010 - 14 janv. 2010 à 02:22
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 16 janv. 2010 à 15:10
Bonjour,

Je développe actuellement une application censée récupérer de fichiers xml provenant d'internet des informations. Sachant que j'ai -énormément- (euphémisme) de fichiers à traiter l'application est donc multithreads.

La récupération des fichiers et leur post traitement s'effectue parfaitement avec 1 thread. Avec 2 aussi mais il arrive qu'il y ait des erreurs...au delà j'obtiens toujours des erreurs d'écriture dans mes tables.

En effet il arrive que 2 threads veulent écrire (ou mettre à jour) des informations dans une même table (voire même créer une nouvelle table identique en même temps) au même moment, ce qui provoque sur l'un d'eux une erreur d'écriture vu que:
"Impossible de mettre à jour; actuellement verrouillé(e)".

J'utilise les composants ADO et développe sous Delphi 7.
Pour effectuer mes opérations SQL j'utilise ADOCommand (et pas de RecordSet vu qu'apparemment leur fermeture est impossible sur des UPDATE ou INSERT).

(Quand 10 threads tournent en même temps sur la bdd l'application semble prendre plus de temps que lorsqu'un seul thread tourne...)

Ma question est donc, est il possible de mettre en place une espèce de section critique pour base de donnée ou alors de vérifier le verrouillage d'une base (et mettre en attente des requêtes) ?

Voila voila mon petit soucis,
J'espère que j'ai expliqué clairement et que j'ai donné les bonnes informations pour que vous puissiez me débloquer.

Cordialement,
Marc

4 réponses

azerty2005 Messages postés 4 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 14 janvier 2010
14 janv. 2010 à 04:02
Et voilà, résolu ! =)

il faut donc mettre Locking mode avant la connexion à 1 et lock retry/delay après la connexion et là...plus de problème ! =)

A bientot,
bon codage !!
3
azerty2005 Messages postés 4 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 14 janvier 2010
14 janv. 2010 à 03:37
Visiblement il suffisait de définir le Locking mode du composant ADOConnection à 1 (pour un vérouillage par ligne et non par table).

Si ça peut aider =)
0
azerty2005 Messages postés 4 Date d'inscription samedi 26 juin 2004 Statut Membre Dernière intervention 14 janvier 2010
14 janv. 2010 à 03:43
En fait ça a réduit énormément mes erreurs d'écriture...je peux passer à 10 threads et 1000 requêtes et 1 erreur..négligeable mais pas acceptable.
(Lorsque j'essaye de mettre des propriétés telles que Lock retry ou lock delay on me sort que ISAM est introuvable...je pense que la solution est là mais....)

Je suis toujours ouvert à des idées!

Cordialement,
Marc
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
16 janv. 2010 à 15:10
Bonjour Azerty2005,

Pourrais-tu indiquer avec quel SGBD tu as rencontré ce problème car la solution proposée (merci à toi) n'est pas forcément applicable à tous les SGBD et ne pourrait être valable que pour un accès aux données avec ADO visiblement.


May Delphi be with you

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

Sauvons MySQL
0
Rejoignez-nous