Acces simultanes dans une table

Résolu
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
- 2 févr. 2009 à 23:35
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
- 8 févr. 2009 à 14:05
Messieurs bonsoir,
J'ai une table qui contient un matricule. Cette table est utilisee et mise a jour par plusieurs personnes en meme temps. Cette rubrique que j'ai appelee Matricule est cree a chaque ajout d'enregistrement(append) dans la table qui est calcule juste en incrementant le dernier matricule enregistre.
comment empecher que deux utilisateurs simultanes creent deux matricules identiques.
exemple :
dernier enregistrement :  128 
deux utiliseurs font un Append en meme temps et auront un meme matricule 129
Comment gerer le fait qu'un utilsateur lance un Append, l'autre utilisateur soit bloquer que le premier n'a pas fait un post.
Merci 
 

17 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
14
3 févr. 2009 à 22:03
Le mieux me semble t-il à moins que delphiprog démontre le contraire est de mettre en place un champ auto-incrémental qui sera géré directement par le serveur lui-même et ainsi même si 50 utilisateurs cliquent en même temps,
le programe s'en sortira et attribuera 50 numéros incrémentés.

et dans cette solution, nul besoin de bloquer quoi que soit...

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
14
5 févr. 2009 à 16:25
Le probleme d'incrementation est resolue. j'ai fait "Reponse acceptee".



oui, mais à l'avenir on repose une autre question sur le forum
la règle est une question par topic sinon c'est le bazard...

bon enfin...
Si j'ai bien compris ta question tu souhaites gérer ce qu'on appelle
"les conflits de partage"

Dans ce domaine, je te conseille dans un premier temps de faire simple :
C'est-à-dire utiliser les transactions :(voir la doc sur starttransaction, commit, rollback etc.)
Il faut choisir un mode dans la propriété TransIsolation du TDatabase si tu tiens à te servir du BDE..

Il faut lire la doc delphi également sur ce sujet car ce n'est pas simple..
tiReadCommitted au début.

Dans ce mode,  il n'y aucun blocage, chaque utilisateur peut écrire en même temps dans une même table.
C'est le dernier qui écrit qui a raison et qui stocke le résultat.
C'est le plus courant..

Mais il y d'autres modes plus difficile à mettre en oeuvre..
Tu peux par exemple bloquer la table pendant une transaction..mais inconvénient si ton utilisateur ne fait rien, elle restera bloquée (qu'on peut quand même libérer avec un TimeOut mais pas facile à gérer surtout avec le BDE..et  il faut derrière traiter tous les messages aux utilisateurs)

cantador
3
cs_Delphiprog
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
9 janvier 2013
31
3 févr. 2009 à 00:28
INSERT INTO maTable(matricule)
SELECT Max(matricule) + 1 FROM maTable

C'est tout simple et ça remplace un champ autoincrémenté.

May Delphi be with you !
<hr color="#008000" />Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
3 févr. 2009 à 17:13
bonsoir,

et si 10 utilisateurs cliquent en même temps ?
que se passe t-il ?

cantador
0

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

Posez votre question
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
3 févr. 2009 à 20:51
Salut les amis,
je reformule ma question :
je veux verrouiller  ma table tant qu'un utilisateur a fait un append et des qu'il fait un post, la table se deverrouille.
Merci
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
4 févr. 2009 à 20:15
Bonsoir,
je voudrai utiliser une fonction que j'ai trouve sur l'internet mais je ne sais vraiment la mettre en oeuvre :

function TableIsReallyLocked(MyTable: TTable): Boolean;
begin
 Result:=False;
 with MyTable do
      begin
      try
         LockTable;
      except                        
          Result:=True;
      end;
  end;
end;
A quel moment on avise les utilsateurs que cette table est verrouillee.

je suis nouveau dans Delphi

Merci
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
4 févr. 2009 à 22:23
ça concerne les tables paradox..
Cela permet de gérer directement la concurrence d'accès au niveau table, indépendamment du niveau d'isolement en vigueur.
Alors que le niveau d'isolement d'une transaction fixe généralement les types de verrous définis lors de l'exécution d'une requête, l'instruction LOCK TABLE permet un verrouillage plus explicite des lignes d'une table.
Attention, c'est très délicat à manipuler..
On lui préfère généralement une gestion au niveau des composants d'accès à la base.
Et puis le BDE + paradox aujourd'hui, c'est franchement à éviter.

cantador
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
4 févr. 2009 à 22:51
Bonsoir,
je vais vous decrire un peu comment je procede.

j'ai mon application sur pc1. Sur le  pc2, je crois un raccourci vers l'applacation sur pc1.
l'utilisateur du pc1 et du pc2 se connectent a l'application.

Je n'ai que append, edit,  post.....Mais pour les composants d'acces aux tables....


je ne sais pas que ce que c'est?


merci
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
5 févr. 2009 à 08:09
oui, mais on a du mal à te suivre...
tu évoques un souci d'incrément et maintenant c'est une base avec 2 users...etc.

je ne sais pas que ce que c'est?

si tu n'en sais pas plus que ça et que tu ne connais pas non plus ton problème ?
...
dur ..dur..

???
cantador
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
5 févr. 2009 à 13:11
bonjour,
Le probleme d'incrementation est resolue. j'ai fait "Reponse acceptee".

c'est suite a votre reponse concernant Lock Table et  en lisant ce que vous avez ecrit:
   "On lui préfère généralement une gestion au niveau des composants   d'accès  à    la base"
que je voulais savoir quels sont les composants qui peuvent gerer tous ces problemes.
C'est pour ce la que je vous decris un peu ma facon de faire les choses et si je suis sur la bonne voie.
merci
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
5 févr. 2009 à 19:23
merci beaucoup Cantador pour les eclaircissement que tu m'as donné.
Je vais me documenter.
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
6 févr. 2009 à 16:39
Bonsoir,
Une question concernant l'autoincrementation du champs, elle se passe  apres avoir poste les donnnees.
Est il possible de voir le numero genere avoir le post pour modifier certains champs?
Merci
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
6 févr. 2009 à 18:21
champs, elle se passe  apres avoir poste les donnnees.

non le numéro est créé juste après le append..

Est il possible de voir le numero genere avoir le post pour modifier certains champs?

voir le numéro, bien sûr..
il suffit d'afficher le champ de la clé primaire.
mais le reste je n'ai pas compris..

cantador
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
6 févr. 2009 à 21:31
Bonsoir,
j'ai fait un essai sur un champs  autoincremental et l'incrementation se fait apres le post. Peut etre qu'il faut fixer une propriete ou quelque chose d'autre.
je ne sais pas mais j'obtiens l'incrementation apres le post.
merci
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
7 févr. 2009 à 16:15
Essaie d'utiliser l'évènement AfterInsert...

cantador
0
belaid52
Messages postés
68
Date d'inscription
jeudi 1 juillet 2004
Statut
Membre
Dernière intervention
23 juin 2011
1
7 févr. 2009 à 17:02
Bonsoir,
je n'ai rien obtenu en utilisant AfterInsert..
merci
0
cs_cantador
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
8 févr. 2009 à 14:05
Oui effectivment il semble que l'on ne peut piéger le n° incrémental qu'après le post..

Cela tient au table paradox car avec d'autres SGDB on peut connaître le numéro dès l'insert..

Mais dans ton cas est-ce un inconvénient sachant que de toutes façons les numéros seront systématiquement différenciés..

cantador
0