Accès multiples lecture écriture

Utilisateur anonyme - 21 juil. 2013 à 23:12
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 22 juil. 2013 à 16:33
Bonjour,
J'ai décomposé mon application en plusieurs services.
Chacun est en charge de collecter des informations dans des fichiers spécifiques.
Dans certains cas des services différents doivent implémenter les mêmes tables.
Est-ce possible? Faut-il prendre certaines précautions?
Est-il préférable des démarrer les services à tour de rôle?
Concernant l'accès en lecture, j'ai développé une APS web. Peut-elle accéder en lecture à une DB si un service est en cours d'implémentation d'une table?
Merci pour vos conseils!!!

7 réponses

solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
22 juil. 2013 à 00:07
Bonsoir,

Tu ouvres là une porte ... Oui il faut prendre des précautions, et tout dépend de la DB derrière. On va faire simple,
En théorie pas de problème sauf que:
- les tables ne sont jamais exclusive=true.
- ne jamais être en mode "edit" sur le même record par plusieurs services/prog en même temps
- idem pas de SQL "update" sur un record en "edit" ailleurs,
- mettre tout les dataset/table/qry en readonly true quand pas de maj sur le dataset (report, grid de selection, ...) c'est dejà çà de moins qu'il aura à gérer,
On peut résoudre les conflits d'update sur les mêmes records avec des try, except, finally pour chaque edit / insert / post des dataset qui risquent d'être en edit par plusieurs services.
- idem pour les ExecSql si update, tu gères les erreurs,
Pas de de prob avec les insert/append car on est en principe seul sur un record avant qu'il soit envoyé dans la table.
Bon courage

solilog
0
Utilisateur anonyme
22 juil. 2013 à 04:10
Donc le plus simple serait de faire tourner mes services l'un après l'autre, mais comment?
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
22 juil. 2013 à 14:41
Salut,

le plus simple est d' utiliser mySQL par exemple ...

a+


Composants Cindy pour Delphi
Faites une donation.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
22 juil. 2013 à 15:14
Salut,
Moi je dirais que tu peux t'intéresser au niveau d'isolation de ta BDD....


Simon
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
solilog Messages postés 273 Date d'inscription samedi 13 juin 2009 Statut Membre Dernière intervention 18 avril 2015 10
22 juil. 2013 à 15:31
Oui Mauricio a raison,
une "vraie" DB simplifierait le mprobleme, normalement tous les Oracle, MySql, DB2 (Firebird ?) gerent bien ces conflits (avec des piles de maj).
1 - PhiLU, qu' utilises-tu comme DB ?
2 - quelle est la periodicite des update de tes services (qq'updates par minute, qq'milliers par minutes, ...) ? ca change tout

Une suggestion. Pourquoi ne pas creer une "table des locks" (tbLocks) avec un record par table. Par ex avant d'ecrire dans la table CLIENT, tu lis le record "CLIENT" de cette table,
- s'il est dispo (statut="F"ree), tu le mets le statut a "L"ocked , ensuite tu ecrits/update ta table CLIENT, puis tu updates a nouveau le statut a "F"free dans tbLocks.
- s'il n'est pas dispo (cad en cours de MAJ par un autre service), tu attends (delay/wait/boucle, ...) qu'il soit libre pour le locker, ecrire et enfin delocker.
Ca ralentira un peu le process mais ca marchera.

create table TBLocks ( --
tbName char(20) not null, -- le nom de la table
tbStatus char(1), -- statut de la table F=Free, L=Locked
tbLibel varchar(50), -- un petit libelle
constraint TBLOCK_01 primary key (tbName)
);

Deux procedures:

procedure LockTable(tbname:shortstring);
begin with tbLocks do begin
findkey ([tbname]);
while fieldbyname('tbStatus').asstring='L' do
begin
delay( 1 seconde );
findkey ([tbname]);
end;
edit;
fieldbyname('tbStatus').asstring:='L';
post;
end; end;

procedure UnlockTable(tbname:shortstring);
begin with tbLocks do begin
findkey ([tbname]);
edit;
fieldbyname('tbStatus').asstring:='F';
post;
end; end;

Et pour chaque "edit" / ExecSql avec update, tu fais:
LockTable('CLIENT');
CLIENT.edit;
et pour chaque post, tu fais:
UnlockTable('CLIENT');
post;
et ceci pour toutes les tables.
Idem pour les ExecSql, tu les "emballes" entre LockTable / UnlockTable.

Ca devrait aller.

Bonne journee.

solilog
0
Utilisateur anonyme
22 juil. 2013 à 16:24
Merci à vous pour ces suggestions!!!
J'utilise MySQL 5.6.12. Moteur InnoDB

@Solilog: 10000000 x merci pour tes idées!!!
Très bonne idée de locker les accès en écriture des tables à l'aide d'une table dans la DB!
Si je dé-locke les tables, quel service va 'plonger' le premier pour mettre à jour lui aussi les tables?

En fait je vais avoir à utiliser cette solution dans différents cas de figure.
J'aurai donc un nombre variable (10 à 25) de services qui devraient à tour de rôle être lancés pour lire des fichiers texte (de quelques milliers de lignes) dans lesquels j'extrait des données pour implémenter la DB (4 tables).
Ensuite en fin de cycle une requête d'affichage (lecture seule) est lancée (depuis une apps web).
... et ainsi de suite (chaque 5 minutes par exemple)
Il me semble qu'il faudrait alors un 'service manager' à moins qu'il soit possible aussi de créer une table nommant la liste (variable - mais facile à gérer) des services à exécuter dans l'ordre?
Dès que le process est terminé pour un service, il se met lui-même en pause, on lit le nom du service suivant et on le lance... si un seul service fonctionne à la fois, pas de soucis de
A la fin de la liste on boucle sur le premier record et ainsi de suite...
Mais dans tous les cas, il faut une petite apps pour permettre à l'utilisateur de surveiller les services.
Je vais voir si un déclencheur peut démarrer un service... mais je ne pense pas :-(

Quel est votre avis?
Thanks!!!
0
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
22 juil. 2013 à 16:33
J' ai une bonne nouvelle: tu n' as rien à faire!
MySQL va gérer les mises à jour (même simultanées) sans problème.

a+


Composants Cindy pour Delphi
Faites une donation.
0
Rejoignez-nous