Acces simultanné à une base des donnée

Résolu
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013 - 21 août 2009 à 23:46
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 17 sept. 2009 à 20:37
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

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
8 sept. 2009 à 13:24
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
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
8 sept. 2009 à 13:35
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
3
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
17 sept. 2009 à 17:43
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
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
17 sept. 2009 à 20:37
Ah ?
eh bien bravo !


cantador
3

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

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
22 août 2009 à 15:06
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 !
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
22 août 2009 à 17:42
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.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 août 2009 à 22:55
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
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
23 août 2009 à 00:05
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).
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
23 août 2009 à 00:18
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 !
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
23 août 2009 à 00:32
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...
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
23 août 2009 à 00:47
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 !
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 août 2009 à 11:42
et j'ajoute qu'on est ici
dans le cadre d'une application en réseau, en mode partagé multi-utilisateurs...


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
23 août 2009 à 22:30
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
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
23 août 2009 à 22:45
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 août 2009 à 23:17
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
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
24 août 2009 à 15:43
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 août 2009 à 16:43
tu as déjà un composant natif :

le TDatabase qui comporte la propriété :
TansIsolation

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
25 août 2009 à 02:30
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
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
25 août 2009 à 09:08
ilReadCommitted

la plus facile à gérer..

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
26 août 2009 à 19:05
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
0
Rejoignez-nous