Accès multiples lecture écriture

Signaler
Messages postés
250
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
4 septembre 2020
-
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
-
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

Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
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
Messages postés
250
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
4 septembre 2020

Donc le plus simple serait de faire tourner mes services l'un après l'autre, mais comment?
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut,

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

a+


Composants Cindy pour Delphi
Faites une donation.
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Salut,
Moi je dirais que tu peux t'intéresser au niveau d'isolation de ta BDD....


Simon
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
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
Messages postés
250
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
4 septembre 2020

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!!!
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
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.