Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1460 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Gestion de la concurrence d'accès dans une appli web jsp

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Gestion de la concurrence d'accès dans une appli web jsp

n°630042
fbarre
Posté le 03-02-2004 à 19:11:39  profilanswer
 

Voilà mon problème :
 
J'ai une table dans ma base de données contenant les infos sur des clients, les nom et prénom, l'adresse, etc.
J'ai créé une page (formulaire) pour ajouter ou modifier un client dans la base. J'aimerais que deux utilisateurs ne puissent pas modifier un même client en même temps. Pour l'instant, comme il n'y  a aucune vérification, seule la dernière modification est prise en compte. Si l'utilisateur B valide juste après l'utilisateur A, les modifications apportées par l'utilisateur A sont perdues. L'idéal serait qu'un message prévienne l'utilisateur B qu'un autre utilisateur (A) est déjà en train de modifier les infos du client.
Est-ce possible ?
Merci d'avance pour vos réponses.

mood
Publicité
Posté le 03-02-2004 à 19:11:39  profilanswer
 

n°630093
Ygrec
Posté le 03-02-2004 à 19:52:50  profilanswer
 

C'est un pb qu'on peut régler en faisant ce qu'on appelle un "optimistic check".
Au moment de mettre à jour tes données, donc dans ton ordre "update", tu vérifies que les données qui sont actuellement présentes en base sont celles que tu as utilisées dans ta page.
Concrètement, tu définis une ou plusieurs colonnes de ta (tes) tables pour lesquelles tu ajoutes un critère dans ta clause where d'update (par ex un Timestamp de dernière mise à jour).
Ex :

Code :
  1. update maTable set macol1=?, macol2=?, timestampmaj=<nouveau tms> where pk=? AND timestampmaj=<ancien tms>


Lorsque tu feras ton statement.executeUpdate(), tu auras en retour 0 (zéro) ou 1 lignes mises à jour. Si c'est zéro, ben ça veut dire que quelqu'un "d'autre" a fait une mise à jour entre temps. A toi de gérer ça dans ta JSP pour afficher le message adéquat à l'utilisateur.
 
Enjoy  :)

n°630118
darklord
You're welcome
Posté le 03-02-2004 à 20:27:33  profilanswer
 

une transaction JTA fera ça pour toi automatiquement. Voir si ton serveur le supporte

n°630120
the real m​oins moins
Posté le 03-02-2004 à 20:31:00  profilanswer
 

et une "bete" transaction jdbc suffirait pas?


Message édité par the real moins moins le 03-02-2004 à 20:32:46

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°630123
darklord
You're welcome
Posté le 03-02-2004 à 20:34:27  profilanswer
 

the real moins moins a écrit :

et une "bete" transaction jdbc suffirait pas?


 
bin non y a pas d'isolation entre différents clients

n°630137
uriel
blood pt.2
Posté le 03-02-2004 à 20:40:44  profilanswer
 

je dis rien sur le coté technique, mais sur le principe, le dernier qui entre des données est censés avoir les données les plus fraiches... pourquoi empecher cet ecrasement (qui aura lieu dès que le premier utilisateur aura fait l'equivalent du commit) :??:


---------------
IVG en france
n°630148
the real m​oins moins
Posté le 03-02-2004 à 20:45:20  profilanswer
 

DarkLord a écrit :


 
bin non y a pas d'isolation entre différents clients

[:core 666] je pensais que la transaction qu'on peut commiter/rollbacker sur java.sql.Connection etait basée sur cette Connection, donc si on part du principe qu'un objet Connection ne sera pas partagé (du moins pas tant que la tx n'a pas été commitée), c'est quoi le pb :??:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°630154
fbarre
Posté le 03-02-2004 à 20:49:17  profilanswer
 

Merci pour toutes vos réponses !
La solution de Ygrec me semble facile à mettre en oeuvre et semble répondre à mon problème. Encore merci !
Pour une transaction JTA, est-ce que quelqu'un aurait un exemple tout bête ?
Pour répondre à Uriel, admettons que A et B remplissent le champ commentaire du formulaire, il ne faut pas que celui de B écrase le commentaire de A. Dans le cas où on bloque la mise à jour de B, celui-ci verra ensuite le commentaire de A et viendra compléter mais en aucun cas ne l'écrasera.

n°630159
fbarre
Posté le 03-02-2004 à 20:52:14  profilanswer
 

Pour real moins moins : comment tu bloques l'accès à la fiche client quand un utilisateur est déjà en train de le modifier avec commit/rollback ?

n°630162
darklord
You're welcome
Posté le 03-02-2004 à 20:52:45  profilanswer
 

the real moins moins a écrit :

[:core 666] je pensais que la transaction qu'on peut commiter/rollbacker sur java.sql.Connection etait basée sur cette Connection, donc si on part du principe qu'un objet Connection ne sera pas partagé (du moins pas tant que la tx n'a pas été commitée), c'est quoi le pb :??:


 
oui mais il n'y a pas de lock sur la resource. Ce qui va se passer c'est que A va prendre le lock sur le client faire ses trucs et comitter. A ce moment B aura la possibilité de prendre le lock et de comitter d'autres modifs.
 
mais donc dans le cas web faut rafraichir les infos que A a comitté et ca c'est pas évident :/

mood
Publicité
Posté le 03-02-2004 à 20:52:45  profilanswer
 

n°630169
the real m​oins moins
Posté le 03-02-2004 à 20:54:17  profilanswer
 

fbarre a écrit :

Pour real moins moins : comment tu bloques l'accès à la fiche client quand un utilisateur est déjà en train de le modifier avec commit/rollback ?

je sais pas :whistle:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°630174
the real m​oins moins
Posté le 03-02-2004 à 20:55:45  profilanswer
 

DarkLord a écrit :


 
oui mais il n'y a pas de lock sur la resource. Ce qui va se passer c'est que A va prendre le lock sur le client faire ses trucs et comitter. A ce moment B aura la possibilité de prendre le lock et de comitter d'autres modifs.
 
mais donc dans le cas web faut rafraichir les infos que A a comitté et ca c'est pas évident :/

[:core 666] j'ai tjs pas tout pigé.
 
(et qd tu parles de lock sur la resource, tu parles de? locker l'acces au "formulaire" par exemple? comment tu fais ça avec jta? :o)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°630176
uriel
blood pt.2
Posté le 03-02-2004 à 20:56:05  profilanswer
 

fbarre a écrit :


Pour répondre à Uriel, admettons que A et B remplissent le champ commentaire du formulaire, il ne faut pas que celui de B écrase le commentaire de A. Dans le cas où on bloque la mise à jour de B, celui-ci verra ensuite le commentaire de A et viendra compléter mais en aucun cas ne l'écrasera.


 
 :jap: merci


---------------
IVG en france
n°630211
darklord
You're welcome
Posté le 03-02-2004 à 21:02:54  profilanswer
 

the real moins moins a écrit :

[:core 666] j'ai tjs pas tout pigé.
 
(et qd tu parles de lock sur la resource, tu parles de? locker l'acces au "formulaire" par exemple? comment tu fais ça avec jta? :o)


 
non locker la resource qu'il veut accéder. Typiquement en JTA tu peux locket une instance d'un Entity Bean par exemple parce que tu as déclaré changer son état.
 
Dans JBoss avec la locking policy par défaut, tu lock tout ce que tu accèdes. Donc si tu démarres une transaction JTA et que tu fais un findByPrimaryKey sur un entity bean A, l'instance de A ne pourra pas etre modifiée par une autre transaction et son état est garantit consistent et durable à la fin de la transaction (commit) -> propriétés ACID de tout système transactionnel (Atomic, Consistent, Isolated, Durable)

n°630245
the real m​oins moins
Posté le 03-02-2004 à 21:15:34  profilanswer
 

tu peux locker quoi d'autre qu'un entity bean? :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°630256
fbarre
Posté le 03-02-2004 à 21:22:14  profilanswer
 

Si j'ai bien compris on peut utiliser une transaction JTA avec un Entity Bean. Seulement, je n'utilise pas d'entity bean, mais seulement des java beans standards (appli web simple : jsp/servlets/java beans). Mais merci pour ton aide DarkLord !


Message édité par fbarre le 03-02-2004 à 21:23:17
n°630267
darklord
You're welcome
Posté le 03-02-2004 à 21:30:28  profilanswer
 

the real moins moins a écrit :

tu peux locker quoi d'autre qu'un entity bean? :o


 
tout ce qui peut etre enlisted dans une transaction JTA, i.e. qui implémente l'interface je-ne-sais-plus-comment qui définit ce qui faut faire en cas de commit/rollback pour la resource en question.
 
Bon w8 je me renseigne :o

n°630269
darklord
You're welcome
Posté le 03-02-2004 à 21:32:39  profilanswer
 

fbarre a écrit :

Si j'ai bien compris on peut utiliser une transaction JTA avec un Entity Bean. Seulement, je n'utilise pas d'entity bean, mais seulement des java beans standards (appli web simple : jsp/servlets/java beans). Mais merci pour ton aide DarkLord !


 
comme le dit moins moins, c'est possible via la connection (je ne savais pas). Mais donc dans ce cas c'est le SGBD qui doit fournir l'isolation :o
 
http://java.sun.com/j2ee/tutorial/ [...] tion9.html


Message édité par darklord le 03-02-2004 à 21:33:15
n°630285
the real m​oins moins
Posté le 03-02-2004 à 21:44:16  profilanswer
 

ayan ! :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°631370
Ygrec
Posté le 04-02-2004 à 18:03:56  profilanswer
 

On peut locker une ligne de table en faisant un "select for update" au lieu du select de base. Ensuite, si un autre client vient à essayer de lire la même ligne, il va rester bloqué jusqu'à ce que le verrou soit levé via commit ou rollback (sur la connection). C'est pour ça qu'il y a des SGBD (Oracle par ex) qui ont une option "nowait" : si le verrou ne peut pas être positionné sur ta ligne tu vas récupérer un code erreur de la BD et donc pouvoir avertir l'utilisateur avec un message du genre "cette donnée est en cours de modification par un autre utilisateur".
Maintenant au niveau web, si tu lockes les lignes au moment ou tu renvoies ta page à l'utilisateur, y'a comme un problème : quand est-ce que ce verrou est libéré, par ex si l'utilisateur ferme son browser ? Donc on ne verrouille pas les lignes au niveau du SGBD sauf en connaissance de cause, d'ou les histoires d'optimistic lock/check ...  
Là le "message utilisateur" est un peu différent : c'est plutôt qque chose comme "les données que vous avez modifié ont été altérées par un autre utilisateur. Voulez-vous recharger les données actuelles ?"
Pour les histoires de lock sur les Entity il me semblait que c'était pareil, çàd que ton update va rester en "suspens" tant que l'autre transaction a pas commité/rollbacké. Tu ne sais pas à l'avance si y'a des modifications "pending", donc pas moyen d'avertir l'utilisateur ...  
Ou me gourre-je (Darklord ?) ?
:heink:

n°631518
darklord
You're welcome
Posté le 04-02-2004 à 20:31:33  profilanswer
 

Bin oui et non, tout dépend de l'update. Mais donc en gros si un client1 choppe un record et le modifie; ca sera intègre et durable (dans le sens ou un client2 ne pourra pas chopper le meme record et le modifier pendant que client1 remplis le formulaire)
 
donc il y a bel et bien un lock. On peut le faire via le SGBD ou via un tx JTA
 
mais dans un cas comme dans l'autre, le message pour l'utilisateur va etre un peu hard à gerer ;)

n°631535
Ygrec
Posté le 04-02-2004 à 20:42:29  profilanswer
 

Ce que tu expliques c'est comment gérer l'intégrité des données. Ca c'est Ok.  
Mais dans un contexte web, y'a un gros décalage entre le moment ou le user récupère les données et le moment où il les met à jour nan ? Donc pb potentiel "d'écrasement" comme en parle fbarre ...
Maintenant pour "avertir" un user qu'il va y avoir un pb de concurrence d'accès, à part les select for update (qu'il ne faut surtout pas faire n'importe comment je répète  :sarcastic:) et les update avec une clause d'optimistic check, je connais pas d'autres méthodes ?

n°631546
fbarre
Posté le 04-02-2004 à 20:52:39  profilanswer
 

ET bien, je ne pensais pas que mon problème déchaînerait les foules :-)
Encore merci de vous décarcasser pour moi !

n°631577
darklord
You're welcome
Posté le 04-02-2004 à 21:19:04  profilanswer
 

Ygrec a écrit :

Ce que tu expliques c'est comment gérer l'intégrité des données. Ca c'est Ok.  
Mais dans un contexte web, y'a un gros décalage entre le moment ou le user récupère les données et le moment où il les met à jour nan ? Donc pb potentiel "d'écrasement" comme en parle fbarre ...
Maintenant pour "avertir" un user qu'il va y avoir un pb de concurrence d'accès, à part les select for update (qu'il ne faut surtout pas faire n'importe comment je répète  :sarcastic:) et les update avec une clause d'optimistic check, je connais pas d'autres méthodes ?
 


Merci de me prendre pour un kéké finit. Initialement je répondais à ca
 

Citation :


J'aimerais que deux utilisateurs ne puissent pas modifier un même client en même temps.


 
et donc oui je sais que ca va pas par magie s'intégrer à un environnement web [:kiki]

n°632713
Ygrec
Posté le 05-02-2004 à 20:47:31  profilanswer
 

Citation :


Merci de me prendre pour un kéké finit


Faut pas le prendre comme ça, je rajoutais juste de l'eau au moulin par rapport à la question initiale, that's all ...
Ok, la forme n'y était ptêt pas, sorry si ça t'a fait penser que je me moquais  :sarcastic:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Gestion de la concurrence d'accès dans une appli web jsp

 

Sujets relatifs
gestion du son avec FMODDépendance de la version d' Excel pour accès par VB ou Java (POI)
STL : gestion des exception. appel explicite?Gestion de fichier des repertoires
requête SQL qui ne passe pas sous Acces mais sous Oracle et MSSQLGestion des collisions avec OPCODE
Pb d'accès à un Webservice[XML] stocker les preferences de mon appli
[Projet fou] Faire une appli de conf audio P2P[windows 2000 server] gerer les DNS avec une appli ASP
Plus de sujets relatifs à : Gestion de la concurrence d'accès dans une appli web jsp


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR