Multi accès sur une base de données [Résolu]

azerty2005 4 Messages postés samedi 26 juin 2004Date d'inscription 14 janvier 2010 Dernière intervention - 14 janv. 2010 à 02:22 - Dernière réponse : cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention
- 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
Afficher la suite 

4 réponses

Répondre au sujet
azerty2005 4 Messages postés samedi 26 juin 2004Date d'inscription 14 janvier 2010 Dernière intervention - 14 janv. 2010 à 04:02
+3
Utile
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 !!
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de azerty2005
azerty2005 4 Messages postés samedi 26 juin 2004Date d'inscription 14 janvier 2010 Dernière intervention - 14 janv. 2010 à 03:37
0
Utile
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 =)
Commenter la réponse de azerty2005
azerty2005 4 Messages postés samedi 26 juin 2004Date d'inscription 14 janvier 2010 Dernière intervention - 14 janv. 2010 à 03:43
0
Utile
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
Commenter la réponse de azerty2005
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 16 janv. 2010 à 15:10
0
Utile
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
Commenter la réponse de cs_Delphiprog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.