Acces simultanes dans une table [Résolu]

belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 2 févr. 2009 à 23:35 - Dernière réponse : cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention
- 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 
 
Afficher la suite 

Votre réponse

17 réponses

Meilleure réponse
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 3 févr. 2009 à 22:03
3
Merci
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

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_cantador
Meilleure réponse
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 5 févr. 2009 à 16:25
3
Merci
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

Merci cs_cantador 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_cantador
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 3 févr. 2009 à 00:28
0
Merci
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.
Commenter la réponse de cs_Delphiprog
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 3 févr. 2009 à 17:13
0
Merci
bonsoir,

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

cantador
Commenter la réponse de cs_cantador
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 3 févr. 2009 à 20:51
0
Merci
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
Commenter la réponse de belaid52
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 4 févr. 2009 à 20:15
0
Merci
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
Commenter la réponse de belaid52
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 4 févr. 2009 à 22:23
0
Merci
ç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
Commenter la réponse de cs_cantador
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 4 févr. 2009 à 22:51
0
Merci
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
Commenter la réponse de belaid52
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 5 févr. 2009 à 08:09
0
Merci
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
Commenter la réponse de cs_cantador
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 5 févr. 2009 à 13:11
0
Merci
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
Commenter la réponse de belaid52
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 5 févr. 2009 à 19:23
0
Merci
merci beaucoup Cantador pour les eclaircissement que tu m'as donné.
Je vais me documenter.
Commenter la réponse de belaid52
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 6 févr. 2009 à 16:39
0
Merci
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
Commenter la réponse de belaid52
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 6 févr. 2009 à 18:21
0
Merci
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
Commenter la réponse de cs_cantador
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 6 févr. 2009 à 21:31
0
Merci
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
Commenter la réponse de belaid52
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 7 févr. 2009 à 16:15
0
Merci
Essaie d'utiliser l'évènement AfterInsert...

cantador
Commenter la réponse de cs_cantador
belaid52 68 Messages postés jeudi 1 juillet 2004Date d'inscription 23 juin 2011 Dernière intervention - 7 févr. 2009 à 17:02
0
Merci
Bonsoir,
je n'ai rien obtenu en utilisant AfterInsert..
merci
Commenter la réponse de belaid52
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 8 févr. 2009 à 14:05
0
Merci
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
Commenter la réponse de cs_cantador

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.