Acces simultanné à une base des donnée [Résolu]

Signaler
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013
-
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
-
Salut
J'utilise SQL Server 2005, un programme est exécuter par deux utilisateurs, lorsque le 1er utilisateur sauve un enregistrement dans la base des données, le 2ème ne saura plus poster l'enregistrement dans la base des données. Un message du genre "La ligne n'a pas pu être trouvée pour la mise à jour. Certaines valeurs ont peut être changé depuis leur dernière lecture". Que faire pour que les 2 utilisateurs travaillent sans se message d'erreur.
a+
Notrica

39 réponses

Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
houlàlà..

DMPlanet1.AdoIbPlanet.BeginTrans; // Début de la transaction 
try 
DMPlanet1.AdoIbPlanet.CommitTrans; // Début de la transaction 


ça marche pas car tu n'as plus de transaction active !

d'où le message...

Ton commitTrans doit intervenir en fin de parcours ! :

try
beginTrans; {début de transaction}

edit;       {édition}
----
----
post;       {écriture dans le tampon de la table}

commitTrans; {écriture dans la table}

except
{quelque soit l'erreur déclenchée, on retire toutes les écritures et on revient au début}

RollbackTrans;
end;


cantador
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
pour bien faire, il faudrait même tester si la transaction est active car si ça plante au début (ce qui est rare..)alors le rollbacktrans plantera..

----
----
except
{quelque soit l'erreur déclenchée, on retire toutes les écritures et on revient au début}
if DMPlanet1.AdoIbPlanet.InTransaction then 
RollbackTrans;



cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

Merci Cantador, j'ai résolu le problème par le moyen des requette.
Encore merci pour m'avoir guider dans la reflexion.
A+
Notrica
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Ah ?
eh bien bravo !


cantador
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
Ca s'appelle un conflit d'accès. Deux utilisateurs accèdent au même moment à la base de données, ce qui crée des incohérences au niveau du contenu de la BDD. Essayez un sémaphore (qui permet de faire passer les utilisateurs chacun leur tour), ou un mutex (plus simple qu'un sémaphore, ne permet qu'un accès à la fois). Par exemple, le mutex autorise un seul accès (donc chacun leur tour), mais le sémaphore peut permettre 1 accès en lecture et 1 accès en écriture, par exemple ...

Cordialement, Bacterius !
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Salut,

Il me semble que l'utilisation d'un sémaphore est plus indiquée dans ce cas.
En effet, avec un mutex seule la tâche qui a alloué l'objet peut le libérer, ce qui risque de bloquer l'accès à la BDD de façon gênante.
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
bonsoir,

sémaphore, mutex ?

tout est prévu dans une base de données..
il suffit de fixer les paramètres de conflit de partage qu'on retrouve sous la propriété isolation des composants Data-Aware.

en gros 3 situations sont déjà programmées :
- on autorise tous les accès à tout moment
(c'est le dernier passé qui donne la dernière version la plus simple..)

- on verrouille la transaction (un seul utilisateur sur un enregistrement)

- on autorise le partage avec messages d'avertissement (on attend que l'autre a terminé ou on prend la main)


cantador
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
J'me disais aussi...
Si c'était pas prévu, les BDD auraient été vraiment nulles !

C'est là qu'on voit que j'y connais rien en BDD. Mais mon observation sur la différence mutex/sémaphore reste valable... pour d'autres cas, bien sûr (ainsi que celle de Bacterius).
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
En fait j'ai l'impression d'avoir dit que de la dans ma dernière phrase (concernant la gestion des accès par le sémaphore).

Cordialement, Bacterius !
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
16
Tu parles de "1 accès en lecture et 1 accès en écriture", Bacterius?

Je pense bien que c'est possible, mais j'ai pas vérifié.

D'ailleurs, je pense que les BDD utilise le sémaphore en interne. Je ne vois pas beaucoup d'autres solutions...
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
J'ai mis ça un peu par défaut, il fallait que je phrase le concept que le sémaphore pouvait gérer plusieurs accès simultanés alors que le mutex ne peut en gérer qu'un seul ...

Cordialement, Bacterius !
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
et j'ajoute qu'on est ici
dans le cadre d'une application en réseau, en mode partagé multi-utilisateurs...


cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

Salut
J'ai utilisé le sémaphore dans le programme principal qui lance l'application. En faut-il aussi le mettre dans le 'DATA MODULE' ?
a+
Notrica
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

Salut
Merci Cantador pour "il suffit de fixer les paramètres de conflit de partage qu'on retrouve sous la propriété isolation des composants Data-Aware". Comment je peux avoir ces composants ? Ses trouvent-ils dans delphi ou sql-serveur?
J'utilise delphi 7 et SQL serveur 2005.
a+
Notrica
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Ses trouvent-ils dans delphi ou sql-serveur?

ni l'un ni l'autre..
il faut les chercher sur internet.
certains sont free, d'autres pas..

cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

Salut,
j'ai cherché sur internet mais malheureusement tout est payant. Y-a-t'il moyen de me brancher sur un lien où je peux trouver du free. Où à defaut pouvez-vs me dire où je peux appliquer le Sémaphore sur le Data Module qui contient toutes les Tables ou le programme appelant le Data Module pour la mise à jour de la base des données ?
Merci d'avance.
a+
notrica
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
tu as déjà un composant natif :

le TDatabase qui comporte la propriété :
TansIsolation

cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

Je me connecte à la base des données avec ADOConnect. Dans ses propriétés il y a 'Isolation Level'. Si ce bien celà, quelle option puis-je selectionner ?
Merci d'avance.
a+
Notrica
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
ilReadCommitted

la plus facile à gérer..

cantador
Messages postés
89
Date d'inscription
lundi 12 décembre 2005
Statut
Membre
Dernière intervention
19 octobre 2013

Salut Cantador
Merci, J'ai bien sélectionne l'option 'ilReadCommitted'. Mais le problème persiste. Le problème se pose en écriture sur la base des données, lorsque un utilisateur enregistre une information dans la base des données, le deuxième utilisateur ne saura plus, un message "La ligne n'a pas été trouvé pour la mise à jour. Certaines valeurs ont peut-être changées depuis leur première lecture" s'affiche. Y-a-t'il moyen de remédier à cela ?
a+
Notrica